Jak pobrać wszystkie wybrane wartości z <select multiple = multiple>?


115

Wydawało się dziwne, że nie mogłem już znaleźć tego, o który pytano, ale gotowe!

Mam następujący 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>

Jak uzyskać wszystkie wartości (tablicę?), Które użytkownik wybrał w javascript?

Na przykład, jeśli użytkownik wybrał Lunch i przekąski, chcę mieć tablicę {2, 4}.

Wydaje się, że powinno to być bardzo proste zadanie, ale nie mogę tego zrobić.

Dzięki.




Odpowiedzi:


105

Zwykły sposób:

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

Z dokumentów :

W przypadku <select multiple="multiple">elementów .val()metoda zwraca tablicę zawierającą każdą wybraną opcję;


10
@augurone: Czy twierdzę, że tak jest?
Felix Kling

9
@FelixKling właśnie zmyliłeś kogoś, kto może od razu dołączyć całą bibliotekę jQuery tylko w tym celu, zanim zda sobie sprawę, że nie powinien, chyba że naprawdę tego potrzebuje.
Aamir Afridi,

32
@AamirAfridi: pytanie jest oznaczone tagiem jQuery. Oznaczanie pytania biblioteką zwykle oznacza, że ​​operator korzysta z tej biblioteki, a odpowiedzi korzystające z biblioteki są mile widziane. Czy mógłbym również zasugerować dzisiaj alternatywny sposób wejścia do jQuery? Może. Ale to pytanie ma więcej niż 3 lata. Zobacz także komentarz OP na temat innej odpowiedzi: stackoverflow.com/questions/11821261/…
Felix Kling

12
Masz rację. To ma sens, jeśli pytanie jest oznaczone tagiem jQuery 😐
Aamir Afridi

148

O ile pytanie nie dotyczy JQuery, najpierw należy odpowiedzieć na to pytanie w standardowym javascript, ponieważ wiele osób nie używa JQuery w swoich witrynach.

Od RobG Jak uzyskać wszystkie wybrane wartości z pola wielokrotnego wyboru za pomocą 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
Jest oznaczony tagiem jquery.
Kyle

1
ha, tego nie widziałem: / nadal +1
mw_21

6
O co chodzi selectedOptions? Czy to nie wystarczy dla wielu przeglądarek? Array.prototype.map.call(el.selectedOptions, function(x){ return x.value })
tenbit

Zauważ, że gdy nie ma valueatrybutu, wtedy opt.value= opt.text.
thdoan

1
Wreszcie! Wanilia ... mój ulubiony smak
papiro

46

Właściwie znalazłem najlepszy, najbardziej zwięzły, najszybszy i najbardziej kompatybilny sposób korzystania z czystego JavaScript (zakładając, że nie musisz w pełni obsługiwać IE lte 8) jest następujący:

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

AKTUALIZACJA (14.02.2017):

Jeszcze bardziej zwięzły sposób korzystania z ES6 / ES2015 (dla przeglądarek, które go obsługują):

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

7
Alternatywnie, jeśli masz element:Array.from(element.querySelectorAll("option:checked"),e=>e.value);
Someguynamedpie

1
Do Twojej wiadomości, szybsze jest użycie kolekcji selectedOptions / options niż użycie querySelectorAll.
Adam Leggett

4
Dzięki @AdamLeggett. Odwołanie się do tych, którzy nie wiedzą, że zmieniłoby markę @ kodu Someguynamedpie za wyżej: Array.from(element.selectedOptions).map(v=>v.value);.
KyleFarris

Tak, ale zobacz moją odpowiedź poniżej - w ogóle nie działa w IE i ma dziwne zachowanie w niektórych starszych wersjach Chrome i Firefox. Jeśli nie zależy Ci na wydajności, querySelectorAll lub filtering element.options załatwią sprawę. Możesz także wykonać [] .map.call () zamiast używać Array.from (), nie wiem, jaki wpływ miałoby to na wydajność, ale na pewno nie byłoby to negatywne.
Adam Leggett

stosować checked ten pracował dla mnie, na multi select listy rozwijanej, ale powinien działać na wszystkich rozwijanych, a także$(".multiple_select > option:checked").each(function(){ console.log(this.value) });
Joviano Dias

15

Jeśli chcesz iść nowocześnie, możesz to zrobić:

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

...Operatora Iterable (mapuje HTMLOptionsCollection) do tablicy.

Jeśli interesują Cię tylko wartości, możesz dodać map()wywołanie:

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

Ta odpowiedź zasługuje na znacznie większe uznanie. Idealne rozwiązanie, dzięki!
Silver Ringvee

10

Najpierw użyj, Array.fromaby przekonwertować HTMLCollectionobiekt na tablicę.

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') będzie zawierać tablicę wszystkich wybranych elementów.

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

Wcześniejsze


6

Aktualizacja październik 2019

Następujące elementy powinny działać samodzielnie we wszystkich nowoczesnych przeglądarkach bez żadnych zależności ani transpilacji.

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

Spróbuj tego:

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

Próbny

$('#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>

skrzypce


3

jeśli chcesz, jak wyraziłeś z przerwami po każdej wartości;

$('#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

Jeśli chcesz zareagować na zmiany, możesz spróbować tego:

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)Jest potrzebna, ponieważ e.target.selectedOptionszwraca HTMLCollection, a nie Array. To wywołanie konwertuje je na Array, abyśmy mogli następnie zastosować mapfunkcję, która wyodrębnia wartości.


1
Niestety nie wszędzie to zadziała, okazuje się, że IE11 nie ma pola selectedOptions. Array.prototype.slice.call(field.querySelectorAll(':checked'))
Działa

0

Coś takiego byłoby moim wyborem:

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

Jest krótki, działa szybko w nowoczesnych przeglądarkach i nie obchodzi nas, czy działa szybko, czy nie w przeglądarkach z 1% udziałem w rynku.

Zauważ, że selectedOptions zachowuje się dziwnie w niektórych przeglądarkach sprzed około 5 lat, więc węszący agent użytkownika nie jest tutaj całkowicie poza linią.


0

Możesz użyć 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

Działa wszędzie bez 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;
};

selectedOptiongsnie jest obsługiwany w IE
Dustin Poissant
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.