Comment obtenir toutes les options d'une sélection en utilisant jQuery?

407

Comment puis-je obtenir toutes les options d'une sélection via jQuery en transmettant son ID?

Je cherche seulement à obtenir leurs valeurs, pas le texte.

Cliquez Upvote
la source

Réponses:

613

Utilisation:

$("#id option").each(function()
{
    // Add $(this).val() to your list
});

.each () | Documentation de l'API jQuery

ybo
la source
63
Aucune des opérations JavaScript ne nécessite jQuery. jQuery est une question de choix pour simplifier les opérations JS.
ruuter
8
vous pouvez également faire: $ ("option # id"). each (fonction (nom, val) {var opt = val.text;});
kofifus
3
$.mapest beaucoup plus élégant et moins sujet aux erreurs (voir ci-dessous).
Elliot Cameron
1
$('#id option').map((index, option) => option.value): notez comment la signature de rappel est inversée par rapport à la mapfonction JS "vanille" ( (item, index) =>)
imrok
168

Je ne connais pas jQuery, mais je sais que si vous obtenez l'élément select, il contient un objet 'options'.

var myOpts = document.getElementById('yourselect').options;
alert(myOpts[0].value) //=> Value of the first option
KooiInc
la source
74
+1. Ne recourez pas à la magie du sélecteur complexe de jQuery pour des choses qui ont déjà des implémentations assez efficaces intégrées dans le vieux DOM.
bobince
19
Pourquoi pas, @bobince? Si vous utilisez principalement jQuery, c'est plus rapide, avec moins de code à écrire, et plus rapide pour ne pas essayer de déterminer si vous devez passer au javascript standard dans ce cas. Et votre code est plus cohérent.
Andrew
139

$.map est probablement le moyen le plus efficace de le faire.

var options = $('#selectBox option');

var values = $.map(options ,function(option) {
    return option.value;
});

Vous pouvez ajouter des options de modification à $('#selectBox option:selected')si vous souhaitez uniquement celles qui sont sélectionnées.

La première ligne sélectionne toutes les cases à cocher et place leur élément jQuery dans une variable. Nous utilisons ensuite la .mapfonction de jQuery pour appliquer une fonction à chacun des éléments de cette variable; tout ce que nous faisons, c'est renvoyer la valeur de chaque élément car c'est tout ce qui nous importe. Parce que nous les renvoyons à l'intérieur de la fonction map, il construit en fait un tableau des valeurs exactement comme demandé.

PCasagrande
la source
3
C'est la solution la plus élégante de l'OMI. La carte est une construction très puissante qui correspond exactement à cette situation.
hazerd
1
J'aime vraiment votre solution - c'est l'approche que j'ai choisie. Cependant, si vous voulez juste les valeurs sélectionnées, c'est encore plus trivial: $('#selectBox').val()retournera un tableau des valeurs sélectionnées.
whoisthemachine
Bonjour, @PCasagrande J'ai un nom d'attribut personnalisé 'type de données'. Comment puis-je en obtenir la valeur en utilisant votre solution? Ce que je fais, c'est «option.data-type», mais cela me donne NaN. Merci d'avance.
Me_developer
Salut, @PCasagrande J'ai obtenu ce dont j'avais besoin en faisant '$ (option, this) .attr ("data-type")'. Mais si vous avez quelque chose de mieux, faites le moi savoir. Merci. :)
Me_developer
Je pense que vous pouvez simplement faire 'return option.attr ("data-type");' sur la carte. Cela devrait vous donner un tableau des valeurs des types de données.
PCasagrande
74

Certaines réponses utilisent each, mais mapc'est une meilleure alternative ici à mon humble avis:

$("select#example option").map(function() {return $(this).val();}).get();

Il y a (au moins) deux mapfonctions dans jQuery. La réponse de Thomas Petersen utilise "Utilities / jQuery.map"; cette réponse utilise "Traversing / map" (et donc un peu de code plus propre).

Cela dépend de ce que vous allez faire avec les valeurs. Si vous voulez, disons, renvoyer les valeurs d'une fonction, mapc'est probablement la meilleure alternative. Mais si vous allez utiliser directement les valeurs que vous souhaitez probablement each.

cic
la source
4
Vous pouvez réellement utiliser this.value au lieu de $ (this) .val () ici. Vous seriez également mieux servi en trouvant les enfants dans le sélecteur initial (option #example). Bien difficile avec le get () à la fin.
Alex Barrett
1
@Alex Barret: Eh bien, il est possible de résoudre ce problème sans utiliser jQuery du tout. L'appel de jQuery avec un élément comme argument ne fera qu'emballer l'élément dans un objet jQuery (c'est-à-dire pas de traversée d'arbre, c'est-à-dire pas si cher). Alors peut-être comme une micro-optimisation, oui.
cic
carte FTW. C'est exactement ainsi que cela doit être fait. Le get () à la fin semble cependant inutile (qui retourne le nœud DOM et val () nous donne déjà une chaîne, donc ...?) Var opts = $ ('option # cm_amt'). Map (function ( ) {return parseInt ($ (this) .val ());});
sbeam
3
@sbeam: "Comme la valeur de retour est un tableau encapsulé dans jQuery, il est très courant que get()l'objet renvoyé fonctionne avec un tableau de base." - api.jquery.com/map
cic
Cela m'a beaucoup aidé, je voulais que le texte ne soit pas la valeur, alors je suis juste passé à la text()place val(). Merci ! (Je vous ai fait dépasser les 1000 ;->)
ParPar
52
$('select#id').find('option').each(function() {
    alert($(this).val());
});
Raibaz
la source
1
C'est le ticket, car j'aime mettre en cache des éléments dans des variables sur init, plutôt que d'utiliser le sélecteur.
Doug Beard
1
Fonctionne également avec $ (this) (qui était ce que vous cherchiez) par exemple,
Hugh Seagraves
16
$("#id option").each(function()
{
    $(this).prop('selected', true);
});

Bien que la méthode CORRECT soit de définir la propriété DOM de l'élément, comme ceci:

$("#id option").each(function(){
    $(this).attr('selected', true);
});
Ben Sewards
la source
4
Ne serait-ce pas .attr ('sélectionné', 'sélectionné')?
v010dya
16

Cela mettra les valeurs d'option de #myselectboxdans un joli tableau propre pour vous:

// First, get the elements into a list
var domelts = $('#myselectbox option');

// Next, translate that into an array of just the values
var values = $.map(domelts, function(elt, i) { return $(elt).val();});
Thomas Petersen
la source
Vous pouvez raccourcir ceci à:$.map(domelts, elt=> $(elt).val())
Jonno_FTW
11

Vous pouvez prendre toutes vos "valeurs sélectionnées" par le nom des cases à cocher et les présenter dans une piqûre séparée par ",".

Une bonne façon de le faire est d'utiliser $ .map () de jQuery:

var selected_val = $.map($("input[name='d_name']:checked"), function(a)
    {
        return a.value;
    }).join(',');

alert(selected_val);
Limpan
la source
6
ce code est assez illisible, je ne l'utiliserais jamais même si c'est plutôt cool.
Cliquez sur Upvote
7
aussi la question concerne selectet optionnon les cases à cocher.
Dementic
6

Exemple de travail

La façon la plus efficace de procéder consiste à utiliser $.map()

Exemple:

var values = $.map($('#selectBox option'), function(ele) {
   return ele.value; 
});
Naveen Kumar Alonekar
la source
3

Vous pouvez utiliser le code suivant pour cela:

var assignedRoleId = new Array();
$('#RolesListAssigned option').each(function(){
    assignedRoleId.push(this.value);
});
Mitul Maheshwari
la source
2

Pour l'option multisélection:

$('#test').val()renvoie la liste des valeurs sélectionnées. $('#test option').lengthrenvoie le nombre total d'options (sélectionnées et non sélectionnées)

Sergei Zinovyev
la source
1

Ceci est un simple script avec jQuery:

var items = $("#IDSELECT > option").map(function() {
    var opt = {};
    opt[$(this).val()] = $(this).text();
    return opt;
}).get();
var selectvalues = [];

for(var i = 0; i < items.length; i++) {
    for(key in items[i]) {


        var id = key;
        var text = items[i][key];

        item = {}
        item ["id"] = id;
        item ["text"] = text;

        selectvalues.push(item);

    }
}
console.log(selectvalues);
copy(selectvalues);
<select>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>
Cubiczx
la source
1

Voici un exemple simple dans jquery pour obtenir toutes les valeurs, textes ou valeur de l'élément sélectionné, ou texte de l'élément sélectionné

$('#nCS1 > option').each((index, obj) => {
   console.log($(obj).val());
})

printOptionValues = () => {

  $('#nCS1 > option').each((index, obj) => {
    console.log($(obj).val());
  })

}

printOptionTexts = () => {
  $('#nCS1 > option').each((index, obj) => {
    console.log($(obj).text());
  })
}

printSelectedItemText = () => {
  console.log($('#nCS1 option:selected').text());
}

printSelectedItemValue = () => {
  console.log($('#nCS1 option:selected').val());
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select size="1" id="nCS1" name="nCS1" class="form-control" >
					<option value="22">Australia</option>
          <option value="23">Brunei</option>
          <option value="33">Cambodia</option>
          <option value="32">Canada</option>
          <option value="27">Dubai</option>
          <option value="28">Indonesia</option>
          <option value="25">Malaysia</option>				
</select>
<br/>
<input type='button' onclick='printOptionValues()' value='print option values' />
<br/>
<input type='button' onclick='printOptionTexts()' value='print option texts' />
<br/>
<input type='button' onclick='printSelectedItemText()' value='print selected option text'/>
<br/>
<input type='button' onclick='printSelectedItemValue()' value='print selected option value' />

NuOne
la source
0
$("input[type=checkbox][checked]").serializeArray();

Ou:

$(".some_class[type=checkbox][checked]").serializeArray();

Pour voir les résultats:

alert($("input[type=checkbox][checked]").serializeArray().toSource());
Pavel Krinitskiy
la source
0

Si vous recherchez toutes les options avec du texte sélectionné, le code ci-dessous fonctionnera.

$('#test').find("select option:contains('B')").filter(":selected");
Tjcool
la source
0

Le chemin court

$(() => {
$('#myselect option').each((index, data) => {
    console.log(data.attributes.value.value)
})})

ou

export function GetSelectValues(id) {
const mData = document.getElementById(id);
let arry = [];
for (let index = 0; index < mData.children.length; index++) {
    arry.push(mData.children[index].value);
}
return arry;}
Emin Adiloğlu
la source