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>

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

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ę”.


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


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


16

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

lubić

value ="123,1234"

a po stronie serwera rozdziel je


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>

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


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


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

});

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>


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];
?>

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

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.


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

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.


-5

możesz użyć wielu atrybutów

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


Chce wielu bitów informacji z jednego wyboru, a nie wielu wyborów.
Barmar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.