Come ottenere tutti i valori selezionati da <select multiple = multiple>?


115

Sembrava strano non riuscivo a trovare questo già chiesto, ma eccolo!

Ho un html come segue:

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

Come ottengo tutti i valori (un array?) Che l'utente ha selezionato in javascript?

Ad esempio, se l'utente ha selezionato Pranzo e snack, desidero un array di {2, 4}.

Sembra che dovrebbe essere un compito molto semplice ma non riesco a farlo.

Grazie.




Risposte:


105

Il solito modo:

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

Dai documenti :

Nel caso di <select multiple="multiple">elementi, il .val()metodo restituisce un array contenente ciascuna opzione selezionata;


10
@augurone: dico che sia?
Felix Kling

9
@FelixKling hai appena fuorviato qualcuno che potrebbe includere immediatamente l'intera libreria jQuery solo per questo prima che si renda conto che non dovrebbe a meno che non ne abbia davvero bisogno.
Aamir Afridi

32
@AamirAfridi: la domanda è taggata con jQuery. Contrassegnare una domanda con una libreria di solito significa che l'operatore utilizza quella libreria e che le risposte che utilizzano la libreria sono benvenute. Suggerirei anche un modo alternativo per accedere a jQuery oggi? Può essere. Ma questa domanda ha più di 3 anni. Vedi anche il commento dell'OP sull'altra risposta: stackoverflow.com/questions/11821261/…
Felix Kling

12
Hai ragione. Ha senso se la domanda è contrassegnata con jQuery 😐
Aamir Afridi

148

A meno che una domanda non richieda JQuery, la domanda dovrebbe essere prima risolta in javascript standard poiché molte persone non usano JQuery nei loro siti.

Da RobG Come ottenere tutti i valori selezionati di una casella di selezione multipla utilizzando 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
È contrassegnato con jquery.
Kyle

1
ah, non l'ho visto: / ancora +1
mw_21

6
Di cosa selectedOptions? Non è sufficiente cross-browser? Array.prototype.map.call(el.selectedOptions, function(x){ return x.value })
tenbits

Nota che quando non ci sono valueattributi, allora opt.value= opt.text.
thdoan

1
Finalmente! Vaniglia ... il mio gusto preferito
papiro

46

In realtà, ho trovato il modo migliore, più succinto, più veloce e più compatibile utilizzando JavaScript puro (supponendo che non sia necessario supportare completamente IE lte 8) è il seguente:

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

AGGIORNAMENTO (14/02/2017):

Un modo ancora più succinto di utilizzare ES6 / ES2015 (per i browser che lo supportano):

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

7
In alternativa, se hai l'elemento:Array.from(element.querySelectorAll("option:checked"),e=>e.value);
Someguynamedpie

1
Solo per tua informazione, è più veloce usare la raccolta selectedOptions / options che usare querySelectorAll.
Adam Leggett

4
Grazie @AdamLeggett. Per riferimento a coloro che non sanno, che avrebbe cambiato make @ codice di Someguynamedpie sopra per: Array.from(element.selectedOptions).map(v=>v.value);.
KyleFarris

Lo sarebbe, ma vedi la mia risposta qui sotto: non funziona affatto su IE e ha un comportamento strano in alcune versioni precedenti di Chrome e Firefox. Se non ti interessano le prestazioni, querySelectorAll o filtering element.options fanno il lavoro. Inoltre, puoi fare [] .map.call () invece di usare Array.from (), non so quale impatto avrebbe sulle prestazioni ma certamente non sarebbe negativo.
Adam Leggett

usato checked Questo ha funzionato per me, su un menu a discesa a selezione multipla, ma dovrebbe funzionare anche per tutti i menu a discesa$(".multiple_select > option:checked").each(function(){ console.log(this.value) });
Joviano Dias

15

Se vuoi andare in modo moderno, puoi farlo:

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

L' ...operatore mappa iterable ( HTMLOptionsCollection) sull'array.

Se sei interessato solo ai valori, puoi aggiungere una map()chiamata:

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

Questa risposta merita molto più credito. Soluzione perfetta, grazie!
Silver Ringvee

10

Innanzitutto, usa Array.fromper convertire l' HTMLCollectionoggetto in un array.

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') conterrà un array di tutti gli elementi selezionati.

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


6

Aggiornamento ottobre 2019

Quanto segue dovrebbe funzionare "stand-alone" su tutti i browser moderni senza dipendenze o transpilation.

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

Prova questo:

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

dimostrazione

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

violino


3

se vuoi come hai espresso con interruzioni dopo ogni valore;

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

Se devi rispondere alle modifiche, puoi provare questo:

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

Il [].slice.call(e.target.selectedOptions)è necessario perché e.target.selectedOptionsrestituisce una HTMLCollection, non un Array. Quella chiamata lo converte in in Arraymodo che possiamo quindi applicare la mapfunzione, che estrae i valori.


1
Purtroppo questo non funzionerà ovunque, risulta che IE11 non ha il campo selectedOptions. Tuttavia, quanto segue funziona:Array.prototype.slice.call(field.querySelectorAll(':checked'))
JamesDev

0

Qualcosa del genere sarebbe la mia scelta:

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

È breve, è veloce sui browser moderni e non ci interessa se è veloce o meno sui browser con una quota di mercato dell'1%.

Nota, selectedOptions ha un comportamento instabile su alcuni browser di circa 5 anni fa, quindi uno sniff di user agent non è del tutto fuori linea qui.


0

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

Funziona ovunque senza 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;
};

selectedOptiongsnon è supportato in IE
Dustin Poissant
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.