Wie erhalte ich alle ausgewählten Werte von <select multiple = multiple>?


115

Es schien seltsam, dass ich diesen nicht schon gefragt finden konnte, aber hier geht es!

Ich habe ein HTML wie folgt:

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

Wie erhalte ich alle Werte (ein Array?), Die der Benutzer in Javascript ausgewählt hat?

Wenn der Benutzer beispielsweise Mittagessen und Snacks ausgewählt hat, möchte ich ein Array von {2, 4}.

Dies scheint eine sehr einfache Aufgabe zu sein, aber ich kann es scheinbar nicht tun.

Vielen Dank.


1
Mögliches Duplikat von Get-Werte aus Mehrfachauswahl in SELECT


Antworten:


103

Der übliche Weg:

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

Aus den Dokumenten :

Bei <select multiple="multiple">Elementen gibt die .val()Methode ein Array zurück, das jede ausgewählte Option enthält.


10
@augurone: Behaupte ich es zu sein?
Felix Kling

9
@FelixKling Sie haben gerade jemanden irregeführt, der möglicherweise sofort die gesamte jQuery-Bibliothek einschließt, bevor er merkt, dass er es nicht sollte, es sei denn, er muss es wirklich.
Aamir Afridi

32
@AamirAfridi: Die Frage ist mit jQuery markiert. Das Markieren einer Frage mit einer Bibliothek bedeutet normalerweise, dass der Op diese Bibliothek verwendet und dass Antworten, die die Bibliothek verwenden, willkommen sind. Würde ich heute auch einen alternativen Weg für jQuery vorschlagen? Vielleicht. Aber diese Frage ist mehr als 3 Jahre alt. Siehe auch den Kommentar des OP zu der anderen Antwort: stackoverflow.com/questions/11821261/…
Felix Kling

12
Du hast recht. Es ist sinnvoll, wenn die Frage mit jQuery 😐
Aamir Afridi

148

Sofern in einer Frage nicht nach JQuery gefragt wird, sollte die Frage zuerst in Standard-Javascript beantwortet werden, da viele Benutzer JQuery auf ihren Websites nicht verwenden.

Von RobG Wie erhalte ich alle ausgewählten Werte eines Mehrfachauswahlfelds mit 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
Es ist mit jquery markiert.
Kyle

1
ha, habe das nicht gesehen: / still +1
mw_21

6
Was ist mit selectedOptions? Ist es nicht browserübergreifend genug? Array.prototype.map.call(el.selectedOptions, function(x){ return x.value })
Tenbits

Beachten Sie, dass, wenn kein valueAttribut vorhanden ist, opt.value= opt.text.
30.

1
Schließlich! Vanille ... mein Lieblingsgeschmack
Papiro

46

Tatsächlich habe ich festgestellt, dass der beste, prägnanteste, schnellste und kompatibelste Weg mit reinem JavaScript (vorausgesetzt, Sie müssen IE lte 8 nicht vollständig unterstützen) der folgende ist:

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

UPDATE (2017-02-14):

Noch prägnanter mit ES6 / ES2015 (für die Browser, die dies unterstützen):

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

7
Alternativ, wenn Sie das Element haben:Array.from(element.querySelectorAll("option:checked"),e=>e.value);
Someguynamedpie

1
Nur zu Ihrer Information, es ist schneller, die Sammlung selectedOptions / options zu verwenden, als querySelectorAll zu verwenden.
Adam Leggett

4
Danke @AdamLeggett. Als Referenz für diejenigen, die es nicht wissen, würde dies den obigen Code von make @ Someguynamedpie in: ändern Array.from(element.selectedOptions).map(v=>v.value);.
KyleFarris

Es würde, aber siehe meine Antwort unten - es funktioniert überhaupt nicht im Internet Explorer und hat in einigen älteren Versionen von Chrome und Firefox ein merkwürdiges Verhalten. Wenn Sie sich nicht für die Leistung interessieren, erledigen querySelectorAll oder filtering element.options die Aufgabe. Sie können auch [] .map.call () anstelle von Array.from () ausführen. Ich weiß nicht, welche Auswirkungen dies auf die Leistung haben würde, aber es wäre sicherlich nicht negativ.
Adam Leggett

verwendet checked Das funktioniert für mich, auf einem Multi wählen Drop - Down, soll aber auch für all Drop-downs arbeiten$(".multiple_select > option:checked").each(function(){ console.log(this.value) });
Joviano Dias

15

Wenn Sie den modernen Weg gehen möchten, können Sie dies tun:

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

Der ...Operator ordnet iterable ( HTMLOptionsCollection) dem Array zu.

Wenn Sie nur an den Werten interessiert sind, können Sie einen map()Aufruf hinzufügen :

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

Diese Antwort verdient viel mehr Anerkennung. Perfekte Lösung, danke!
Silver Ringvee

10

Verwenden Sie zunächst Array.from, um das HTMLCollectionObjekt in ein Array zu konvertieren .

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') enthält ein Array aller ausgewählten Elemente.

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

.


5

Update Oktober 2019

Das Folgende sollte in allen modernen Browsern "unabhängig" ohne Abhängigkeiten oder Transpilation funktionieren.

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

Versuche dies:

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

Demo

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

Geige


3

wenn Sie möchten, wie Sie mit Pausen nach jedem Wert ausgedrückt haben;

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

Wenn Sie auf Änderungen reagieren müssen, können Sie Folgendes versuchen:

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

Das [].slice.call(e.target.selectedOptions)wird benötigt, weil e.target.selectedOptionsa zurückgegeben wird HTMLCollection, nicht an Array. Dieser Aufruf konvertiert es in, Arraydamit wir dann die mapFunktion anwenden können, die die Werte extrahiert.


1
Leider funktioniert dies nicht überall. IE11 verfügt nicht über das Feld selectedOptions. Folgendes funktioniert jedoch:Array.prototype.slice.call(field.querySelectorAll(':checked'))
JamesDev

0

So etwas wie das Folgende wäre meine Wahl:

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

Es ist kurz, es ist schnell in modernen Browsern und es ist uns egal, ob es schnell ist oder nicht in Browsern mit einem Marktanteil von 1%.

Beachten Sie, dass selectedOptions in einigen Browsern seit etwa 5 Jahren ein wackeliges Verhalten aufweist, sodass ein Benutzeragenten-Sniff hier nicht völlig aus der Reihe gerät.


-1

Funktioniert überall ohne Abfrage:

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

selectedOptiongswird im IE nicht unterstützt
Dustin Poissant
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.