Semblait étrange je ne pouvais pas trouver celui-ci déjà demandé, mais le voilà!
J'ai un code HTML comme suit:
<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>
Comment puis-je obtenir toutes les valeurs (un tableau?) Que l'utilisateur a sélectionnées en javascript?
Par exemple, si l'utilisateur a sélectionné Lunch et Snacks, je souhaite un tableau de {2, 4}.
Cela semble être une tâche très simple, mais je n'arrive pas à le faire.
Merci.
La manière habituelle:
var values = $('#select-meal-type').val();
De la docs :
Dans le cas d'éléments
<select multiple="multiple">
, la méthode.val()
renvoie un tableau contenant chaque option sélectionnée.
À moins qu'une question ne demande JQuery, il faut d'abord répondre à la question en javascript standard, car de nombreuses personnes n'utilisent pas JQuery sur leurs sites.
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;
}
En fait, j'ai trouvé le meilleur, le plus succinct, le plus rapide et le plus compatible en utilisant du JavaScript pur (en supposant que vous n'avez pas besoin de supporter complètement IE lte 8) est le suivant:
var values = Array.prototype.slice.call(document.querySelectorAll('#select-meal-type option:checked'),0).map(function(v,i,a) {
return v.value;
});
MISE À JOUR (2017-02-14):
Une manière encore plus succincte d’utiliser ES6/ES2015 (pour les navigateurs qui le supportent):
const selected = document.querySelectorAll('#select-meal-type option:checked');
const values = Array.from(selected).map(el => el.value);
$('#select-meal-type :selected')
contiendra un tableau de tous les éléments sélectionnés.
$('#select-meal-type option:selected').each(function() {
alert($(this).val());
});
Le plus grand centre commercial
Commencez par utiliser Array.from
pour convertir l'objet HTMLCollection
en un tableau.
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
si vous voulez comme vous l'avez exprimé avec des pauses après chaque valeur;
$('#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
})
Essaye ça:
$('#select-meal-type').change(function(){
var arr = $(this).val()
});
Démo
$('#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>
Si vous devez réagir aux modifications, vous pouvez essayer ceci:
document.getElementById('select-meal-type').addEventListener('change', function(e) {
let values = [].slice.call(e.target.selectedOptions).map(a => a.value));
})
La [].slice.call(e.target.selectedOptions)
est nécessaire car e.target.selectedOptions
renvoie une HTMLCollection
et non une Array
. Cet appel le convertit en Array
afin que nous puissions ensuite appliquer la fonction map
, qui extrait les valeurs.
Si vous voulez aller de la manière moderne, vous pouvez le faire:
const selectedOpts = [...field.options].filter((x) => x.selected);
L'opérateur ...
mappe iterable (HTMLOptionsCollection
) au tableau.
Si les valeurs vous intéressent, vous pouvez ajouter un appel map()
:
const selectedValues = [...field.options]
.filter((x) => x.selected)
.map((x)=>x.value);
Quelque chose comme ce qui suit serait mon choix:
let selectElement = document.getElementById('categorySelect');
let selectedOptions = selectedElement.selectedOptions || [].filter.call(selectedElement.options, option => option.selected);
let selectedValues = [].map.call(selectedOptions, option => option.value);
C'est bref, c'est rapide sur les navigateurs modernes, et nous ne nous soucions pas de savoir si c'est rapide ou non sur les navigateurs à 1% du marché.
Notez que selectedOptions a un comportement dérisoire sur certains navigateurs depuis environ 5 ans. Un sniff agent utilisateur n’est donc pas totalement hors ligne ici.
Fonctionne partout sans 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;
};