2012-08-06 204 views
38

Parecía extraño No pude encontrar este ya pedido, ¡pero aquí va!¿Cómo obtener todos los valores seleccionados de <select multiple = multiple>?

que tienen un html de la siguiente manera:

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

¿Cómo consigo todos los valores (? Una matriz) que el usuario ha seleccionado en javascript?

Por ejemplo, si el usuario ha seleccionado Lunch and Snacks, quiero una matriz de {2, 4}.

Parece que debería ser una tarea muy simple pero parece que no puedo hacerlo.

Gracias.

+1

posible duplicado de [Obtener valores de varias selecciones en SELECT] (http://stackoverflow.com/questions/1749082/get-values-from-multiple-selections- in-select) –

+0

posible duplicado de [¿Cómo obtener múltiples valores de cuadro de selección usando jquery?] (http://stackoverflow.com/questions/3243476/how-to-get-multiple-select-box-values-using-jquery) –

+0

Posible duplicado de [¿Cómo obtener todos los valores seleccionados de un cuadro de selección múltiple usando JavaScript?] (Http://stackoverflow.com/questions/5866169/how-to-get-all-selected-values-of-a- multiple-select-box-using-javascript) – jtheletter

Respuesta

44

la forma habitual:

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

Desde el docs:

En el caso de <select multiple="multiple"> elementos, el método .val() devuelve una matriz que contiene cada opción seleccionada ;

+37

jQuery no es la respuesta a todas las cosas. – augurone

+7

@augurone: ¿Lo reclamo? –

+3

@FelixKling simplemente confundiste a alguien que inmediatamente podría incluir toda la jQuery lib solo por esto antes de darse cuenta de que no debería hacerlo a menos que realmente lo necesite. –

7

$('#select-meal-type :selected') contendrá una matriz de todos los elementos seleccionados.

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

+1

Esto responde la búsqueda real ion en el título. –

2

Prueba esto:

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

demostración

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

fiddle

3

si lo desea, como expresó con descansos después de cada valor;

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

A menos que una pregunta es para jQuery, la pregunta debería ser respondida por primera vez en JavaScript estándar ya que muchas personas no utilizan jQuery en sus sitios.

De RobG How to get all selected values of a multiple select box using 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; 
} 
+9

Está etiquetada con jquery. – Kyle

+1

ha, no he visto que:/still +1 –

+4

¿Qué hay de 'selectedOptions'? ¿No es lo suficientemente cruzado? 'Array.prototype.map.call (el.selectedOptions, function (x) {return x.value})' – tenbits

16

En realidad, he encontrado la mejor manera, la mayoría-sucinta, más rápido y más compatibles que utilizan JavaScript puro (suponiendo que no es necesario para apoyar plenamente IE LTE 8) es la siguiente:

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

UPDATE (02/14/2017):

Una forma aún más sucinta usando ES6/ES2 015 (para los navegadores que lo soportan):

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

Si tiene que responder a los cambios, puedes intentar esto:

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

El [].slice.call(e.target.selectedOptions) es necesaria porque e.target.selectedOptions devuelve un HTMLCollection, no un Array . Esa llamada lo convierte en Array para que luego podamos aplicar la función map, que extrae los valores.

+0

Lamentablemente esto no funcionará en todas partes, resulta que IE11 no tiene el campo seleccionadoOpciones . Sin embargo, lo siguiente sí funciona: 'Array.prototype.slice.call (field.querySelectorAll (': checked'))' – JamesDev

0

funciona en todas partes sin 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; 
}; 
Cuestiones relacionadas