Wie erhalte ich mit jQuery alle Optionen einer Auswahl?

406

Wie kann ich alle Optionen einer Auswahl über jQuery erhalten, indem ich ihre ID weitergebe?

Ich suche nur nach ihren Werten, nicht nach dem Text.

Klicken Sie auf Upvote
quelle

Antworten:

612

Verwenden:

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

.each () | jQuery API-Dokumentation

ybo
quelle
63
Keine der JavaScript-Operationen erfordert jQuery. jQuery ist eine Frage der Wahl, um JS-Operationen zu vereinfachen.
Ruuter
8
Sie können auch Folgendes tun: $ ("# id option"). each (function (name, val) {var opt = val.text;});
Kofifus
3
$.mapist viel eleganter und weniger fehleranfällig (siehe unten).
Elliot Cameron
1
$('#id option').map((index, option) => option.value): Beachten Sie, wie die Rückrufsignatur im Vergleich zur "Vanille" JS- mapFunktion ( (item, index) =>)
umgekehrt wird
168

Ich kenne jQuery nicht, aber ich weiß, dass wenn Sie das select-Element erhalten, es ein 'options'-Objekt enthält.

var myOpts = document.getElementById('yourselect').options;
alert(myOpts[0].value) //=> Value of the first option
KooiInc
quelle
74
+1. Verwenden Sie nicht die komplexe Auswahlmagie von jQuery für Dinge, die bereits recht effiziente Implementierungen in das einfache alte DOM integriert haben.
Bobince
19
Warum nicht, @bobince? Wenn Sie meistens jQuery verwenden, ist es schneller, wenn weniger Code geschrieben werden muss, und schneller, nicht herauszufinden, ob Sie in diesem Fall zu normalem Javascript wechseln sollten. Und Ihr Code ist konsistenter.
Andrew
138

$.map ist wahrscheinlich der effizienteste Weg, dies zu tun.

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

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

Sie können Änderungsoptionen hinzufügen, $('#selectBox option:selected')wenn Sie nur die ausgewählten Optionen möchten.

In der ersten Zeile werden alle Kontrollkästchen aktiviert und das jQuery-Element in eine Variable eingefügt. Wir verwenden dann die .mapFunktion von jQuery, um eine Funktion auf jedes der Elemente dieser Variablen anzuwenden. Alles, was wir tun, ist, den Wert jedes Elements zurückzugeben, da dies alles ist, was uns wichtig ist. Da wir sie innerhalb der Kartenfunktion zurückgeben, wird tatsächlich ein Array der Werte wie angefordert erstellt.

PCasagrande
quelle
3
Dies ist die eleganteste Lösung IMO. Map ist ein sehr leistungsfähiges Konstrukt, das genau in diese Situation passt.
Hazerd
1
Ihre Lösung gefällt mir sehr gut - es ist der Ansatz, den ich gewählt habe. Wenn Sie jedoch nur die ausgewählten Werte möchten, ist dies noch trivialer: $('#selectBox').val()Gibt ein Array der ausgewählten Werte zurück.
whoisthemachine
Hallo, @PCasagrande Ich habe einen benutzerdefinierten Attributnamen 'Datentyp'. Wie kann ich mit Ihrer Lösung den Wert davon ermitteln? Was ich tue, ist 'option.data-type', aber das gibt mir NaN. Danke im Voraus.
Me_developer
Hallo, @PCasagrande Ich habe das bekommen, was ich brauchte, indem ich '$ (Option, dies) .attr ("Datentyp")' gemacht habe. Aber wenn Sie etwas Besseres haben, lassen Sie es mich wissen. Vielen Dank. :)
Me_developer
Ich denke, Sie können einfach 'return option.attr ("Datentyp");' in der Karte. Das sollte Ihnen ein Array der Werte der Datentypen geben.
PCasagrande
74

Einige Antworten verwenden each, ist aber mapmeiner Meinung nach eine bessere Alternative:

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

mapIn jQuery gibt es (mindestens) zwei Funktionen. Die Antwort von Thomas Petersen verwendet "Utilities / jQuery.map"; Diese Antwort verwendet "Traversing / Map" (und daher einen etwas saubereren Code).

Es hängt davon ab, was Sie mit den Werten machen werden. Wenn Sie beispielsweise die Werte einer Funktion zurückgeben möchten, mapist dies wahrscheinlich die bessere Alternative. Aber wenn Sie die Werte direkt verwenden möchten, möchten Sie wahrscheinlich each.

cic
quelle
4
Sie können hier tatsächlich this.value anstelle von $ (this) .val () verwenden. Sie sind auch besser bedient, wenn Sie die Kinder in der anfänglichen Auswahl finden (Option #example). Schön hart mit dem get () am Ende.
Alex Barrett
1
@ Alex Barret: Nun, es ist möglich, dieses Problem zu lösen, ohne jQuery zu verwenden. Wenn Sie jQuery mit einem Element als Argument aufrufen, wird das Element einfach in ein jQuery-Objekt eingeschlossen (dh kein Baumdurchlauf, dh nicht so teuer). Also vielleicht als Mikrooptimierung ja.
Cic
Karte FTW. Genau so sollte es gemacht werden. Das get () am Ende scheint jedoch unnötig (das gibt den DOM-Knoten zurück und val () gibt uns bereits eine Zeichenfolge, also ...?) Var opts = $ ('# cm_amt option'). Map (function ( ) {return parseInt ($ (this) .val ());});
Beam
3
@sbeam: "Da der Rückgabewert ein von jQuery umschlossenes Array ist, arbeitet get()das zurückgegebene Objekt häufig mit einem Basisarray." - api.jquery.com/map
cic
Es hat mir sehr geholfen, ich wollte den Text nicht den Wert, also habe ich text()stattdessen einfach gewechselt val(). Vielen Dank ! (Ich habe Sie veranlasst, über die 1000 zu gehen ;->)
ParPar
52
$('select#id').find('option').each(function() {
    alert($(this).val());
});
Raibaz
quelle
1
Dies ist das Ticket, da ich Elemente auf init lieber in Variablen zwischenspeichern möchte, als den Selektor zu verwenden.
Doug Beard
1
Funktioniert auch mit $ (this) (was gesucht wurde) zB
Hugh Seagraves
16
$("#id option").each(function()
{
    $(this).prop('selected', true);
});

Die richtige Methode besteht jedoch darin, die DOM-Eigenschaft des Elements wie folgt festzulegen :

$("#id option").each(function(){
    $(this).attr('selected', true);
});
Ben Sewards
quelle
4
Wäre es nicht .attr ('ausgewählt', 'ausgewählt')?
v010dya
16

Dadurch werden die Optionswerte von #myselectboxin ein schönes, sauberes Array für Sie eingefügt:

// 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
quelle
Sie können dies verkürzen auf: $.map(domelts, elt=> $(elt).val())
Jonno_FTW
11

Sie können alle Ihre "ausgewählten Werte" anhand des Namens der Kontrollkästchen nehmen und sie in einem durch "," getrennten Stich darstellen.

Eine gute Möglichkeit, dies zu tun, ist die Verwendung von $ .map () von jQuery:

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

alert(selected_val);
Limpan
quelle
6
Dieser Code ist ziemlich unlesbar, ich würde ihn nie benutzen, selbst wenn er irgendwie cool ist.
Klicken Sie auf Upvote
7
Auch bei der Frage geht es um selectund optionnicht um Kontrollkästchen.
Dementic
6

Arbeitsbeispiel

Der effizienteste Weg, dies zu tun, ist die Verwendung $.map()

Beispiel:

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

Sie können dafür folgenden Code verwenden:

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

Für Mehrfachauswahloption:

$('#test').val()Gibt eine Liste der ausgewählten Werte zurück. $('#test option').lengthGibt die Gesamtzahl der Optionen zurück (sowohl ausgewählt als auch nicht ausgewählt).

Sergei Zinovyev
quelle
1

Dies ist ein einfaches Skript mit 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
quelle
1

Hier ist ein einfaches Beispiel in jquery, um alle Werte, Texte oder Werte des ausgewählten Elements oder den Text des ausgewählten Elements abzurufen

$('#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
quelle
0
$("input[type=checkbox][checked]").serializeArray();

Oder:

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

Um die Ergebnisse zu sehen:

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

Wenn Sie nach allen Optionen mit ausgewähltem Text suchen, funktioniert der folgende Code.

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

Der kurze Weg

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

oder

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
quelle