Czy opcja w tagu Select może mieć wiele wartości?

104

Mam wybrany tag z kilkoma opcjami w formie HTML:
(dane będą zbierane i przetwarzane za pomocą PHP)

Testowanie:

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

Czy jest możliwa opcja przenoszenia wielu wartości, np. Gdy użytkownik wybierze „One”, wówczas do Bazy Danych zostanie zapisanych kilka innych wartości związanych z tą opcją.

Jak zaprojektować selecttag, aby każda z opcji mogła mieć jedną wartość, taką jak ta:

<select name="Testing">  
  <option value="1" value="2010"> One  
  <option value="2" value="2122"> Two  
  <option value="3" value="0"> Three
</select>
user327712
źródło
1
czy używasz php jako skryptu serwera do przetwarzania
Jaison Justus
1
po prostu ciekawy, dlaczego tego potrzebujesz?
Salil,
2
@Salil. Z ciekawości czy da się to zrobić
user327712
stackoverflow.com/questions/38180525/… Pracuj dla mnie.
Caio Andrian

Odpowiedzi:

153

Jeden sposób, aby to zrobić, najpierw tablica, a następnie obiekt:

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

Edytowano (3 lata po udzieleniu odpowiedzi), aby umieścić obie wartości w formacie JSON (używając JSON.stringify()) z powodu skargi, że moja odpowiedź dotycząca weryfikacji koncepcji „może zmylić początkującego programistę”.

Robusto
źródło
9
+1 za eleganckie rozwiązanie. NB Jeśli używasz opcji drugiej, to polecam użyć $ .parseJSON ($ (this) .val ()) w zdarzeniu zmiany, aby uzyskać obiekt javascript, zakładając, że musisz uzyskać każdą wartość osobno.
Lucas B,
1
-1, ponieważ ta odpowiedź powoduje, że OP ma duży problem z bezpieczeństwem w swoim kodzie podczas oceny danych wejściowych. Najlepszym sposobem uniknięcia tego jest użycie formatu JSON, zgodnie z sugestią @DavidHoerster, ponieważ dane wejściowe są lepiej zachowane.
fotanus
5
@fotanus: Mój drugi przykład to literał obiektu JSON, który nie różni się od tego, co proponuje drugie pytanie. Jeśli chodzi o tablicę, to tylko przykład. Odpowiedzialność za oczyszczanie wartości wejściowych i tak spoczywa na kodzie po stronie serwera.
Robusto
1
@Robusto drugi przykład nie jest prawidłowym plikiem JSON. Z drugiej strony jest to rubinowy haszysz. Mój problem z twoją odpowiedzią nie dotyczy tego, co wyjaśniasz lub wiesz (ponieważ uważam, że wiesz, jak to zabezpieczyć), chodzi o to, co pomija i może zmylić początkującego programistę (tak jak w przypadku jednego z moich znajomych).
fotanus
11
Dobre rozwiązanie, ale aby łańcuch był analizowany do JSON, nazwy właściwości muszą mieć podwójne cudzysłowy, na przykład: value = '{"foo": "bar", "one": "two"}'
Lars-Lasse
52

Właściwie zastanawiałem się nad tym dzisiaj i osiągnąłem to, używając funkcji eksplozji php, na przykład:

Formularz HTML (w pliku o nazwie „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>

Akcja PHP (w pliku o nazwie doublevalue_action.php)

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

Jak widać w pierwszym fragmencie kodu, tworzymy standardowe pole wyboru HTML z 2 opcjami. Każda opcja ma 1 wartość, która ma separator (w tym przypadku „|”), który rozdziela wartości (w tym przypadku model i kolor).

Na stronie akcji eksploduję wyniki do tablicy, a następnie wywołuję każdy z nich. Jak widać, oddzieliłem je i oznaczyłem, abyś mógł zobaczyć, jaki to powoduje.

Mam nadzieję, że to komuś pomoże :)

Nedra
źródło
1
Uważam, że ta metoda jest bardzo prosta i bardzo pomocna, ale zastanawiam się, czy jest ona obsługiwana przez wszystkie przeglądarki?
Waiyl Karim
wygląda bardzo prosto i wydajnie. Dzięki
Varun Garg
Genialny, niesamowity, wspaniały ... klejnot klasy.
user3370889
3
@WaiylKarim Nie ma powodu, dla którego to nie powinno działać we wszystkich przeglądarkach. Przeglądarki nie powinny przejmować się tym, co jest w wartości. A jeśli mają problem z jakimiś symbolami, to nie ma problemu z wybraniem innego. Na przykład kropka, # lub _ lub dowolny znak, który może być użyty jako separator po stronie serwera
Risinek,
najlepsze rozwiązanie dla mnie
fizzi
25

możliwe jest posiadanie wielu wartości w opcji wyboru, jak pokazano poniżej.

<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>

możesz uzyskać wybraną wartość na zdarzeniu zmiany za pomocą jquery, jak pokazano poniżej.

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

Więcej szczegółów znajdziesz w tym LINKU

Vara
źródło
16

Jedną z opcji jest umieszczenie wielu wartości oddzielonych przecinkami

lubić

value ="123,1234"

a po stronie serwera rozdziel je

Haim Evgi
źródło
jak oddzielić je po stronie serwera? (w php)
Muhammad Ashfaq
jak funkcja wybuchania
Haim Evgi
12

Kiedy muszę to zrobić, tworzę inne wartości dane-wartości, a następnie używam js, aby przypisać je do ukrytych danych wejściowych

<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
źródło
1
To mi częściowo pomogło - również, możesz użyć .data (), aby je odzyskać, jeśli masz już element (w przeciwieństwie do zapytania selektora). np. myElem.data ('othervalue')
jsh
2
Nie o to technicznie pyta OP, ale o to w 100% starałem się osiągnąć, szukając tutaj. +1 za prostą, lepszą ścieżkę do tego, co, jak zakładam, było końcowym celem po prostu przechowywania dwóch fragmentów danych w wybranej opcji.
Lime
5

Jeśli Twoim celem jest zapisanie tych informacji w bazie danych, to dlaczego potrzebujesz mieć podstawową wartość i „powiązane” wartości w value atrybucie? Dlaczego nie po prostu wysłać wartości podstawowej do bazy danych i pozwolić, aby relacyjny charakter bazy danych zajął się resztą.

Jeśli potrzebujesz wielu wartości w swoich OPTION, wypróbuj separator, który nie jest zbyt powszechny:

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

...

lub dodaj literał obiektu (format JSON):

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

...

To naprawdę zależy od tego, co próbujesz zrobić.

David Hoerster
źródło
4

podaj wartości dla każdej opcji, takiej jak

<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>

po stronie serwera w przypadku php, użyj funkcji takich jak eksploduj [tablica] = eksploduj ([ogranicznik], [podana wartość]);

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

powyższy kod zwraca tablicę zawierającą tylko liczby, a znak „:” zostaje usunięty

Jaison Justus
źródło
4

Zrobiłem to za pomocą atrybutów danych. Jest dużo czystszy niż inne metody eksplozji itp.

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);

});
Jacek
źródło
4

A co z atrybutami danych HTML? To najłatwiejszy sposób. Odniesienie z w3school

W Twoim przypadku

$('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
źródło
1
Aby to zadziałało, potrzebne jest „dane-”, a druga część musi być zapisana małymi literami.
Arun Prasad ES
1

Użyj separatora, aby oddzielić wartości.

<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.
źródło
1

W HTML

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

Dla JS

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

LUB DLA PHP

  $selectedValue= explode(',', $value);
  $valueOne= $exploded_value[0]; //output 1
  $valueTwo= $exploded_value[1]; //output 2010
kunal shaktawat
źródło
0

Zduplikowane parametry tagów nie są dozwolone w HTML. Co możesz zrobić, to VALUE="1,2010". Ale musiałbyś przeanalizować wartość na serwerze.

Witek
źródło
0

Zamiast przechowywać opcje po stronie klienta, innym sposobem jest przechowywanie opcji jako elementów tablicy asocjacyjnej / indeksowanej po stronie serwera. Wartości tagu select zawierałyby wtedy po prostu klucze używane do wyłuskiwania podtablicy.

Oto przykładowy kod. Jest napisane w PHP, ponieważ OP wspomniał o PHP, ale można je dostosować do dowolnego języka po stronie serwera, którego używasz:

<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
źródło
0

Może to być przydatne lub nie dla innych, ale w moim konkretnym przypadku po prostu chciałem, aby dodatkowe parametry były przekazywane z formularza po wybraniu opcji - te parametry miały takie same wartości dla wszystkich opcji, więc ... moje rozwiązanie polegało na dołączeniu do formularza ukrytych danych wejściowych z zaznaczeniem, np .:

<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>

Może oczywiste ... bardziej oczywiste, kiedy to zobaczysz.

MangoCat
źródło
-5

możesz użyć wielu atrybutów

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

Alex Kumbhani
źródło
Chce wielu bitów informacji z jednego wyboru, a nie wielu wyborów.
Barmar