Як отримати всі вибрані значення з <select multiple = multiple>?


115

Здавалося, дивним я не міг знайти цього вже запитуваного, але ось це йде!

У мене є HTML таким чином:

<select id="select-meal-type" multiple="multiple">
    <option value="1">Breakfast</option>
    <option value="2">Lunch</option>
    <option value="3">Dinner</option>
    <option value="4">Snacks</option>
    <option value="5">Dessert</option>
</select>

Як отримати всі значення (масив?), Які користувач вибрав у JavaScript?

Наприклад, якщо користувач обрав обід та закуски, я хочу масив {2, 4}.

Це здається, що це повинно бути дуже простим завданням, але я не можу зробити це.

Дякую.




Відповіді:


105

Звичайний спосіб:

var values = $('#select-meal-type').val();

З документів :

У випадку <select multiple="multiple">елементів, .val()метод повертає масив, що містить кожен обраний параметр;


10
@augurone: Я можу це зробити?
Фелікс Клінг

9
@FelixKling ви просто ввели в оману когось, хто може одразу включити цілу лінійку jQuery саме для цього, перш ніж він зрозуміє, що не повинен, якщо йому справді не потрібно.
Аамір Африді

32
@AamirAfridi: питання позначено тегом jQuery. Позначення питання бібліотекою зазвичай означає, що оператор використовує цю бібліотеку, і відповіді, що використовують бібліотеку, вітаються. Я б також запропонував альтернативний шлях Іни сьогодні до jQuery? Може бути. Але це питання більше 3 років. Також дивіться коментар ОП щодо іншої відповіді: stackoverflow.com/questions/11821261/…
Фелікс Клінг,

12
Ти правий. Має сенс, якщо питання позначено тегом jQuery 😐
Аамір Афріді,

148

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

З RobG Як отримати всі вибрані значення вікна декількох виділень за допомогою JavaScript? :

  function getSelectValues(select) {
  var result = [];
  var options = select && select.options;
  var opt;

  for (var i=0, iLen=options.length; i<iLen; i++) {
    opt = options[i];

    if (opt.selected) {
      result.push(opt.value || opt.text);
    }
  }
  return result;
}

24
Позначено тегом jquery.
Кайл

1
га, не бачив цього: / все-таки +1
mw_21

6
Про що selectedOptions? Чи недостатньо крос-браузера? Array.prototype.map.call(el.selectedOptions, function(x){ return x.value })
tenbits

Зауважте, що коли немає valueатрибуту, тоді opt.value= opt.text.
туан

1
Нарешті! Ваніль ... мій улюблений аромат
папіро

46

Насправді я знайшов найкращий, найкоротший, найшвидший та найсумісніший спосіб за допомогою чистого JavaScript (припустимо, що вам не потрібно повністю підтримувати IE lte 8) - це наступне:

var values = Array.prototype.slice.call(document.querySelectorAll('#select-meal-type option:checked'),0).map(function(v,i,a) { 
    return v.value; 
});

ОНОВЛЕННЯ (2017-02-14):

Ще кращіший спосіб використання ES6 / ES2015 (для браузерів, які його підтримують):

const selected = document.querySelectorAll('#select-meal-type option:checked');
const values = Array.from(selected).map(el => el.value);

7
Як варіант, якщо у вас є елемент:Array.from(element.querySelectorAll("option:checked"),e=>e.value);
Someguynamedpie

1
Просто FYI, швидше використовувати вибрану колекціюOptions / options, ніж використовувати querySelectorAll.
Адам Леггетт

4
Дякую @AdamLeggett Для посилання на тих , хто не знає, що б змінити макіяж @ код Someguynamedpie в вище: Array.from(element.selectedOptions).map(v=>v.value);.
KyleFarris

Було б, але дивіться мою відповідь нижче - він зовсім не працює на IE і має дивну поведінку в деяких старих версіях Chrome і Firefox. Якщо ви не дбаєте про продуктивність, querySelectorAll або фільтруючи element.options справді виконають роботу. Крім того, ви можете зробити [] .map.call () замість Array.from (), я не знаю, який вплив це вплине на продуктивність, але це, звичайно, не буде негативним.
Адам Леггетт

Використовується checked Це працювало для мене, у спадному режимі з декількома виборами, але має працювати і для всіх спаду,$(".multiple_select > option:checked").each(function(){ console.log(this.value) });
Joviano Dias

15

Якщо ви хочете піти сучасним шляхом, ви можете зробити це:

const selectedOpts = [...field.options].filter((x) => x.selected);

...Оператор переводить Iterable ( HTMLOptionsCollection) в масив.

Якщо вас просто цікавлять цінності, ви можете додати map()дзвінок:

const selectedValues = [...field.options]
                     .filter((x) => x.selected)
                     .map((x)=>x.value);

Ця відповідь заслуговує на більший кредит. Ідеальне рішення, дякую!
Срібний рингвей

10

По-перше, використовуйте Array.fromдля перетворення HTMLCollectionоб'єкта в масив.

let selectElement = document.getElementById('categorySelect')
let selectedValues = Array.from(selectElement.selectedOptions)
        .map(option => option.value) // make sure you know what '.map' does

// you could also do: selectElement.options

9

$('#select-meal-type :selected') міститиме масив усіх обраних елементів.

$('#select-meal-type option:selected').each(function() {
    alert($(this).val());
});

Сігналы абмеркавання


6

Оновлення жовтня 2019 року

Далі слід працювати "автономно" на всіх сучасних браузерах без будь-яких залежностей та транспіляції.

<!-- display a pop-up with the selected values from the <select> element -->

<script>
 const showSelectedOptions = options => alert(
   [...options].filter(o => o.selected).map(o => o.value)
 )
</script>

<select multiple onchange="showSelectedOptions(this.options)">
  <option value='1'>one</option>
  <option value='2'>two</option>
  <option value='3'>three</option>
  <option value='4'>four</option>
</select>

4

Спробуйте це:

$('#select-meal-type').change(function(){
    var arr = $(this).val()
});

Демо

$('#select-meal-type').change(function(){
  var arr = $(this).val();
  console.log(arr)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="select-meal-type" multiple="multiple">
  <option value="1">Breakfast</option>
  <option value="2">Lunch</option>
  <option value="3">Dinner</option>
  <option value="4">Snacks</option>
  <option value="5">Dessert</option>
</select>

скрипка


3

якщо ви хочете, як ви виражали з перервами після кожного значення;

$('#select-meal-type').change(function(){
    var meals = $(this).val();
    var selectedmeals = meals.join(", "); // there is a break after comma

    alert (selectedmeals); // just for testing what will be printed
})

2

Якщо вам потрібно відповісти на зміни, ви можете спробувати це:

document.getElementById('select-meal-type').addEventListener('change', function(e) {
    let values = [].slice.call(e.target.selectedOptions).map(a => a.value));
})

[].slice.call(e.target.selectedOptions)Необхідно тому , що e.target.selectedOptionsповертає HTMLCollection, а НЕ Array. Цей виклик перетворює його Arrayтак, щоб потім ми могли застосувати mapфункцію, яка витягує значення.


1
На жаль, це працює не скрізь, виявляється, у IE11 не вибрано поле Опції. Однак працює так:Array.prototype.slice.call(field.querySelectorAll(':checked'))
JamesDev

0

Щось таке було б моїм вибором:

let selectElement = document.getElementById('categorySelect');
let selectedOptions = selectedElement.selectedOptions || [].filter.call(selectedElement.options, option => option.selected);
let selectedValues = [].map.call(selectedOptions, option => option.value);

Це коротко, це швидко в сучасних браузерах, і нам не байдуже, чи це швидко, чи не на 1% браузерах.

Зауважте, у деяких веб-переглядачах вибрані параметри незвично проявляють себе близько 5 років тому, тож нюхає агент-користувач.


0

Можна використовувати selectedOptions

var selectedValues = Array.from(document.getElementById('select-meal-type').selectedOptions).map(el=>el.value);
console.log(selectedValues);
<select id="select-meal-type" multiple="multiple">
    <option value="1">Breakfast</option>
    <option value="2" selected>Lunch</option>
    <option value="3">Dinner</option>
    <option value="4" selected>Snacks</option>
    <option value="5">Dessert</option>
</select>


-1

Працює всюди без jquery:

var getSelectValues = function (select) {
    var ret = [];

    // fast but not universally supported
    if (select.selectedOptions != undefined) {
        for (var i=0; i < select.selectedOptions.length; i++) {
            ret.push(select.selectedOptions[i].value);
        }

    // compatible, but can be painfully slow
    } else {
        for (var i=0; i < select.options.length; i++) {
            if (select.options[i].selected) {
                ret.push(select.options[i].value);
            }
        }
    }
    return ret;
};

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