Uma opção em uma tag Select pode carregar vários valores?

103

Recebi uma tag select com algumas opções em formato HTML:
(os dados serão coletados e processados ​​em PHP)

Teste:

<select name="Testing">  
  <option value="1"> One  
  <option value="2"> Two  
  <option value="3"> Three
</select>

É possível que uma opção carregue vários valores como quando um usuário seleciona "Um", então alguns outros valores relacionados a esta opção serão gravados no banco de dados.

Como devo projetar a selecttag de modo que cada uma das opções possa ter um valor como este:

<select name="Testing">  
  <option value="1" value="2010"> One  
  <option value="2" value="2122"> Two  
  <option value="3" value="0"> Three
</select>
user327712
fonte
1
você está usando php como script de servidor para processamento
Jaison Justus
1
apenas curioso por que você precisa disso?
Salil
2
@Salil. Por curiosidade, se é possível fazê-lo
user327712
stackoverflow.com/questions/38180525/… Trabalhe para mim.
Caio Andrian

Respostas:

153

Uma maneira de fazer isso, primeiro um array, depois um objeto:

    <select name="">
        <option value='{"num_sequence":[0,1,2,3]}'>Option one</option>
        <option value='{"foo":"bar","one":"two"}'>Option two</option>
    </select>

Editado (3 anos após a resposta) para colocar ambos os valores no formato JSON (usando JSON.stringify()) devido a uma reclamação de que minha resposta à prova de conceito "poderia confundir um desenvolvedor iniciante".

Robusto
fonte
9
1 para solução elegante. NB: Se você usar a opção dois, eu recomendo que você use $ .parseJSON ($ (this) .val ()) no evento de mudança para obter um objeto javascript, supondo que você precise obter cada valor separadamente.
Lucas B
1
-1 porque esta resposta induz o OP a ter um grande problema de segurança em seu código ao avaliar a entrada. A melhor maneira de evitar isso é usando JSON, conforme sugerido por @DavidHoerster, porque a entrada é melhor comportada.
fotanus
5
@fotanus: Meu segundo exemplo é um objeto JSON literal não diferente do que a outra questão propõe. Quanto ao array, é apenas um exemplo. É responsabilidade do código do lado do servidor limpar os valores de entrada de qualquer maneira.
Robusto
1
@Robusto o segundo exemplo não é um JSON válido. É, por outro lado, um hash de rubi. Meu problema com sua resposta não é sobre o que você explica ou sabe (porque acredito que você sabe como tornar isso seguro), é sobre o que omite e pode confundir um desenvolvedor novato (como fez com um amigo meu).
fotanus
11
Boa solução, mas para a string ser analisada em JSON, os nomes das propriedades devem ter aspas duplas, assim: value = '{"foo": "bar", "one": "two"}'
Lars-Lasse
51

Eu estava realmente me perguntando isso hoje, e consegui usando a função explodir do php, assim:

Formulário HTML (em um arquivo denominado 'doublevalue.php':

    <form name="car_form" method="post" action="doublevalue_action.php">
            <select name="car" id="car">
                    <option value="">Select Car</option>
                    <option value="BMW|Red">Red BMW</option>
                    <option value="Mercedes|Black">Black Mercedes</option>
            </select>
            <input type="submit" name="submit" id="submit" value="submit">
    </form>

Ação do PHP (em um arquivo denominado doublevalue_action.php)

    <?php
            $result = $_POST['car'];
            $result_explode = explode('|', $result);
            echo "Model: ". $result_explode[0]."<br />";
            echo "Colour: ". $result_explode[1]."<br />";
    ?>

Como você pode ver na primeira parte do código, estamos criando uma caixa de seleção HTML padrão, com 2 opções. Cada opção possui 1 valor, que possui um separador (neste caso, '|') para dividir os valores (neste caso, modelo e cor).

Na página de ação, estou explodindo os resultados em uma matriz e chamando cada um. Como você pode ver, eu os separei e rotulei para que você possa ver o efeito que isso está causando.

Espero que isso ajude alguém :)

Nedra
fonte
1
Acho esse método muito simples e útil, mas estou me perguntando se esse método é compatível com todos os navegadores?
Waiyl Karim
parece muito simples e eficiente. Obrigado
Varun Garg
Brilhante, incrível, excelente .. joia de uma classe.
user3370889
3
@WaiylKarim Não há razão para não funcionar em todos os navegadores. Os navegadores não devem se preocupar com o que está no valor. E se eles tiverem problemas com alguns símbolos nele, não há problema em escolher outro. Como ponto ou # ou _ ou qualquer caractere que pode ser usado como delimitador no lado do servidor
Risinek
25

é possível ter vários valores em uma opção de seleção, conforme mostrado abaixo.

<select id="ddlEmployee" class="form-control">
    <option value="">-- Select --</option>
    <option value="1" data-city="Washington" data-doj="20-06-2011">John</option>
    <option value="2" data-city="California" data-doj="10-05-2015">Clif</option>
    <option value="3" data-city="Delhi" data-doj="01-01-2008">Alexander</option>
</select>

você pode obter o valor selecionado no evento de mudança usando jquery como mostrado abaixo.

$("#ddlEmployee").change(function () {
     alert($(this).find(':selected').data('city'));
});

Você pode encontrar mais detalhes neste LINK

Vara
fonte
16

uma opção é colocar vários valores com vírgulas separadas

gostar

value ="123,1234"

e no lado do servidor separe-os

Haim Evgi
fonte
como separá-los no lado do servidor? (em php)
Muhammad Ashfaq
como função de explosão
Haim Evgi
12

Quando preciso fazer isso, eu crio os outros valores dados-valores e uso js para atribuí-los a uma entrada oculta

<select id=select>
<option value=1 data-othervalue=2 data-someothervalue=3>
//...
</select>

<input type=hidden name=otherValue id=otherValue />
<input type=hidden name=someOtherValue id=someOtherValue />

<script>
$('#select').change(function () {
var otherValue=$(this).find('option:selected').attr('data-othervalue');
var someOtherValue=$(this).find('option:selected').attr('data-someothervalue');
$('#otherValue').val(otherValue);
$('#someOtherValue').val(someOtherValue);
});
</script>
chiliNUT
fonte
1
Isso me ajudou em parte - também posso usar .data () para recuperá-los se você já tiver um elemento (em vez de fazer uma consulta de seletor). por exemplo, myElem.data ('othervalue')
jsh
2
Isso não é tecnicamente o que o OP pede, mas é 100% o que eu estava tentando realizar quando vim pesquisar aqui. 1 para o caminho simples e melhor para o que presumo ser o objetivo final de simplesmente armazenar duas partes de dados em uma opção selecionada.
Lima
5

Se seu objetivo é gravar essas informações no banco de dados, por que você precisa ter um valor primário e valores 'relacionados' no valueatributo? Por que não apenas enviar o valor primário para o banco de dados e deixar a natureza relacional do banco de dados cuidar do resto?

Se você precisar ter vários valores em seus OPTIONs, tente um delimitador que não seja muito comum:

<OPTION VALUE="1|2010">One</OPTION>

...

ou adicione um objeto literal (formato JSON):

<OPTION VALUE="{'primary':'1','secondary':'2010'}">One</OPTION>

...

Realmente depende do que você está tentando fazer.

David Hoerster
fonte
4

coloque valores para cada opção como

<SELECT NAME="val">
   <OPTION VALUE="1" value="1:2:3:4"> 1-4  
   <OPTION VALUE="2" value="5:6:7:8"> 5-8  
   <OPTION VALUE="3" value="9:10:11:12"> 9-12
</SELECT>

no lado do servidor no caso de php, use funções como explode [array] = explode ([delimeter], [post value]);

$values = explode(':',$_POST['val']

o código acima retorna uma matriz com apenas os números e o ':' é removido

Jaison Justus
fonte
4

Eu fiz isso usando atributos de dados. É muito mais limpo do que outros métodos que tentam explodir, etc.

HTML

<select class="example">
    <option value="1" data-value="A">One</option>
    <option value="2" data-value="B">Two</option>
    <option value="3" data-value="C">Three</option>
    <option value="4" data-value="D">Four</option>
</select>

JS

$('select.example').change(function() {

    var other_val = $('select.example option[value="' + $(this).val() + '"]').data('value');

    console.log(other_val);

});
Jack
fonte
4

E os atributos de dados html? Essa é a maneira mais fácil. Referência da w3school

No seu caso

$('select').on('change', function() {
  alert('value a is:' + $("select option:selected").data('valuea') +
    '\nvalue b is:' + $("select option:selected").data('valueb')
  )
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
<select name="Testing">
  <option value="1" data-valuea="2010" data-valueb="2011"> One
    <option value="2" data-valuea="2122" data-valueb="2123"> Two
      <option value="3" data-valuea="0" data-valueb="1"> Three
</select>

Ankit
fonte
1
"data-" é necessário para que isso funcione, e a segunda parte deve ser minúscula.
Arun Prasad ES
1

Use um delimitador para separar os valores.

<select name="myValues">
<option value="one|two">
</select>

<?php>
$value = filter_input(INPUT_POST, 'myValues');
$exploded_value = explode('|', $value);
$value_one = $exploded_value[0];
$value_two = $exploded_value[1];
?>
Chad C.
fonte
1

Em HTML

<SELECT NAME="Testing" id="Testing">  
  <OPTION VALUE="1,2010"> One  
  <OPTION VALUE="2,2122"> Two  
  <OPTION VALUE="3,0"> Three
</SELECT>

Para JS

  var valueOne= $('#Testing').val().split(',')[0];
  var valueTwo =$('#Testing').val().split(',')[1];
  console.log(valueOne); //output 1
  console.log(valueTwo); //output 2010

OU PARA PHP

  $selectedValue= explode(',', $value);
  $valueOne= $exploded_value[0]; //output 1
  $valueTwo= $exploded_value[1]; //output 2010
kunal shaktawat
fonte
0

Parâmetros de tag duplicados não são permitidos em HTML. O que você poderia fazer, é VALUE="1,2010". Mas você teria que analisar o valor no servidor.

Witek
fonte
0

Em vez de armazenar as opções no lado do cliente, outra maneira de fazer isso é armazenar as opções como elementos de submatriz de uma matriz associativa / indexada no lado do servidor. Os valores da tag de seleção conteriam apenas as chaves usadas para cancelar a referência da submatriz.

Aqui está algum código de exemplo. Isso é escrito em PHP, pois o OP mencionou PHP, mas pode ser adaptado para qualquer linguagem do lado do servidor que você estiver usando:

<FORM action="" method="POST">
    <SELECT NAME="Testing">  
        <OPTION VALUE="1"> One </OPTION> 
        <OPTION VALUE="2"> Two </OPTION>
        <OPTION VALUE="3"> Three </OPTION>
    </SELECT>
</FORM>

PHP:

<?php
$options = array(
    1 => array('value1' => '1', 'value2' => '2010'),
    2 => array('value1' => '2', 'value2' => '2122'),
    3 => array('value1' => '3', 'value2' => '0'),
);
echo 'Selected option value 1: ' . $options[$_POST['Testing']]['value1'] . '<br>';
echo 'Selected option value 2: ' . $options[$_POST['Testing']]['value2'] . '<br>';
Kodos Johnson
fonte
0

Isso pode ou não ser útil para outras pessoas, mas para meu caso de uso específico, eu só queria que parâmetros adicionais fossem passados ​​de volta do formulário quando a opção fosse selecionada - esses parâmetros tinham os mesmos valores para todas as opções, então ... minha solução era incluir entradas ocultas no formulário com o select, como:

<FORM action="" method="POST">
    <INPUT TYPE="hidden" NAME="OTHERP1" VALUE="P1VALUE">
    <INPUT TYPE="hidden" NAME="OTHERP2" VALUE="P2VALUE">
    <SELECT NAME="Testing">  
        <OPTION VALUE="1"> One </OPTION> 
        <OPTION VALUE="2"> Two </OPTION>
        <OPTION VALUE="3"> Three </OPTION>
    </SELECT>
</FORM>

Talvez óbvio ... mais óbvio depois que você vê.

MangoCat
fonte
-5

você pode usar vários atributos

<SELECT NAME="Testing" multiple>  
 <OPTION VALUE="1"> One  
 <OPTION VALUE="2"> Two  
 <OPTION VALUE="3"> Three

Alex Kumbhani
fonte
Ele quer vários bits de informação de uma seleção, não várias seleções.
Barmar de