Чи може варіант з тегом Select нести кілька значень?


103

Я отримав тег вибору з деякими параметрами у формі HTML:
(дані будуть збиратися та оброблятися за допомогою PHP)

Тестування:

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

Чи можливий варіант, який може переносити кілька значень, наприклад, коли користувач вибирає "Один", то кілька інших значень, пов'язаних з цим параметром, будуть записані в Базу даних.

Як мені створити selectтег, щоб кожен із варіантів міг мати одне, ніж одне значення:

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

1
ви використовуєте php як серверний скрипт для обробки
Jaison Justus

1
просто цікаво навіщо це вам потрібно?
Саліл

2
@Salil. З цікавості, якщо це можливо зробити
user327712

Відповіді:


153

Один із способів зробити це: перший масив, другий об'єкт:

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

Відредаговано (3 роки після відповіді), щоб ввести обидва значення у формат JSON (використовуючи JSON.stringify()) через скаргу на те, що моя відповідь на підтвердження концепції "може заплутати розробника-початківця".


9
+1 для елегантного рішення. Примітка: Якщо ви використовуєте варіант другий, я рекомендую вам використовувати $ .parseJSON ($ (це) .val ()) у випадку зміни, щоб отримати об’єкт javascript, якщо вважати, що вам потрібно отримати кожне значення окремо.
Лукас Б

1
-1 тому, що ця відповідь спонукає ОП до виникнення великої проблеми із захистом у його коді під час оцінки вхідних даних. Найкращий спосіб уникнути цього - використання JSON, як це запропонував @DavidHoerster, тому що введення краще ведеться.
fotanus

5
@fotanus: Мій другий приклад - це буквальний об'єкт JSON, який не відрізняється від того, що пропонує інше питання. Що стосується масиву, то це лише приклад. Код на стороні сервера несе відповідальність за те, щоб в будь-якому разі очистити вхідні значення.
Robusto

1
@Robusto другий приклад не є дійсним JSON. Це, з іншого боку, рубіновий хеш. Моя проблема з вашою відповіддю полягає не в тому, що ви пояснюєте чи знаєте (тому що я вважаю, що ви знаєте, як зробити це безпечним), а в тому, що це упускає і може заплутати розробника-новачка (як це було з одним моїм другом).
fotanus

11
Гарне рішення, але для розбору рядка на JSON, імена властивостей повинні мати подвійні лапки, як-от так: value = '{"foo": "bar", "one": "two"}'
Lars-Lasse

51

Мені сьогодні це було цікаво, і я досяг цього, використовуючи функцію php explode, наприклад:

Форма HTML (у файлі, який я назвав "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>

Дія PHP (у файлі, який я назвав doublevalue washing.php)

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

Як ви бачите в першому фрагменті коду, ми створюємо стандартне поле вибору HTML з двома параметрами. Кожен параметр має 1 значення, у якому є роздільник (у даному випадку "|") для розділення значень (у цьому випадку модель та колір).

На сторінці дії я вибудовую результати в масив, а потім викликаю кожен. Як бачите, я розділяв їх і маркував, щоб ви могли бачити ефект, який це викликає.

Я сподіваюся, що це комусь допоможе :)


1
Я вважаю цей метод дуже простим і дуже корисним, але мені цікаво, чи підтримують цей метод усі браузери?
Вайіл Карим

виглядає дуже просто і ефективно. Спасибі
Варун Гарг

Блискучий, дивовижний, чудовий .. дорогоцінний камінь класу.
користувач3370889

3
@WaiylKarim Немає причини, чому він не повинен працювати у всіх браузерах. Браузери не повинні дбати про те, що є у цінності. І якщо вони мають проблеми з деякими символами в ньому, немає проблеми вибрати інший. Як точка або # або _ або будь-який символ, який можна використовувати як роздільник на стороні сервера
Risinek

25

можливо, у параметрі вибору є декілька значень, як показано нижче.

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

ви можете отримати вибране значення для події зміни, використовуючи jquery, як показано нижче.

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

Більш детальну інформацію можна знайти на цьому ПОСИЛАННІ


16

один варіант - поставити багатозначне значення, відокремлене комою

подібно до

value ="123,1234"

а на стороні сервера відокремте їх


як розділити їх на стороні сервера? (in php)
Мухаммед Ашфак

як функція вибуху
Хаїм Евгі

12

Коли мені потрібно це зробити, я роблю інші значення-значення даних, а потім використовую js, щоб призначити їх прихованому входу

<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
Це додало мені частину шляху - також можна використовувати .data (), щоб повернути їх назад, якщо у вас вже є елемент (проти виконання запиту селектора). наприклад, myElem.data ('othervalue')
jsh

2
Це технічно не те, що запитує ОП, але це на 100% те, що я намагався досягти, коли прийшов шукати сюди. +1 для простого, кращого шляху до того, що я припускаю, було кінцевою метою просто зберігати два фрагменти даних у вибраному варіанті.
Лайм

5

Якщо ваша мета полягає в тому, щоб записати цю інформацію в базу даних, то навіщо вам потрібно мати valueатрибут " первинне" значення "пов'язані" ? Чому б просто не надіслати первинне значення в базу даних і дозволити реляційному характеру бази даних подбати про інше.

Якщо вам потрібно мати кілька значень у своєму OPTIONs, спробуйте роздільник, який не дуже поширений:

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

...

або додати об'єкт буквально (формат JSON):

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

...

Це дійсно залежить від того, що ти намагаєшся зробити.


4

ставити значення для кожного варіанта, як

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

на стороні сервера у разі php використовуйте такі функції, як explode [array] = explode ([delimeter], [posted value]);

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

вищезазначений код повертає масив, має лише числа, а ":" вилучається


4

Я зробив це за допомогою атрибутів даних. Це набагато чистіше, ніж інші методи, які намагаються вибухнути і т.д.

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

Що з атрибутами даних html? Це найпростіший спосіб. Довідка від w3school

У вашому випадку

$('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
"data-" потрібні, щоб це працювало, а друга частина повинна мати малі регістри.
Arun Prasad ES

1

Використовуйте роздільник, щоб розділити значення.

<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

В HTML

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

Для JS

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

АБО ДЛЯ PHP

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

0

Повторювані параметри тегів у HTML не дозволені. Що ти міг зробити, так і є VALUE="1,2010". Але вам доведеться проаналізувати значення на сервері.


0

Замість того, щоб зберігати параметри на стороні клієнта, інший спосіб зробити це - зберігати параметри як елементи підмасиву асоціативного / індексованого масиву на стороні сервера. Значення тегу select тоді просто міститимуть ключі, які використовуються для вилучення підмасиву.

Ось приклад коду. Це написано на PHP з моменту згаданого PHP в ОП, але його можна адаптувати до будь-якої мови серверного сервісу, якою ви користуєтеся:

<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

Це може бути або не корисно для інших, але для мого конкретного випадку використання я просто хотів, щоб додаткові параметри передавались із форми, коли була обрана опція - ці параметри мали однакові значення для всіх параметрів, тому ... моє рішення полягав у тому, щоб у формі включати приховані входи з виділенням, наприклад:

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

Може бути очевидним ... більш очевидним після того, як ви його побачите.


-5

ви можете використовувати кілька атрибутів

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


Він хоче декілька бітів інформації з одного вибору, а не декілька виборів.
Бармар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.