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.