Come ottenere tutte le opzioni di una selezione usando jQuery?


Risposte:


612

Uso:

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

.each () | Documentazione API jQuery


63
Nessuna delle operazioni JavaScript richiede jQuery. jQuery è una questione di scelta per semplificare le operazioni JS.
ruuter,

8
puoi anche fare: $ ("opzione # id"). each (funzione (nome, val) {var opt = val.text;});
Kofifus il

3
$.mapè molto più elegante e meno soggetto a errori (vedi sotto).
Elliot Cameron,

1
$('#id option').map((index, option) => option.value): nota come la firma di callback viene invertita rispetto alla mapfunzione JS "vanilla" ( (item, index) =>)
imrok

168

Non conosco jQuery, ma so che se ottieni l'elemento select, contiene un oggetto "opzioni".

var myOpts = document.getElementById('yourselect').options;
alert(myOpts[0].value) //=> Value of the first option

74
+1. Non ricorrere alla complessa magia selettrice di jQuery per cose che hanno già implementazioni abbastanza efficienti integrate nel semplice vecchio DOM.
mercoledì

19
Perché no, @bobince? Se usi principalmente jQuery è più veloce sia con meno codice da scrivere, sia più veloce non cercare di capire se in questo caso dovresti passare al javascript normale. E il tuo codice è più coerente.
Andrew

139

$.map è probabilmente il modo più efficace per farlo.

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

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

È possibile aggiungere opzioni di modifica a $('#selectBox option:selected')se si desidera solo quelle selezionate.

La prima riga seleziona tutte le caselle di controllo e inserisce il loro elemento jQuery in una variabile. Quindi utilizziamo la .mapfunzione di jQuery per applicare una funzione a ciascuno degli elementi di quella variabile; tutto ciò che stiamo facendo è restituire il valore di ogni elemento poiché è tutto ciò a cui teniamo. Poiché li stiamo restituendo all'interno della funzione della mappa, in realtà crea un array di valori esattamente come richiesto.


3
Questa è la soluzione più elegante IMO. La mappa è un costrutto molto potente che si adatta esattamente a questa situazione.
Hazerd,

1
Mi piace molto la tua soluzione: è l'approccio con cui sono andato. Tuttavia, se vuoi solo i valori selezionati è ancora più banale: $('#selectBox').val()restituirà una matrice dei valori selezionati.
whoisthemachine,

Ciao, @PCasagrande Ho un nome di attributo personalizzato 'tipo-dati'. Come posso ottenere il valore di questo usando la tua soluzione? Quello che sto facendo è 'option.data-type', ma questo mi sta dando NaN. Grazie in anticipo.
Me_developer l'

Ciao, @PCasagrande Ho ottenuto ciò di cui avevo bisogno facendo '$ (opzione, questa) .attr ("tipo di dati")'. Ma se hai qualcosa di meglio, fammelo sapere. Grazie. :)
Me_developer l'

Penso che tu possa semplicemente fare 'return option.attr ("tipo di dati");' nella mappa. Ciò dovrebbe fornire una matrice dei valori dei tipi di dati.
PCasagrande,

74

Alcune risposte usano each, ma mapè un'alternativa migliore qui IMHO:

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

Ci sono (almeno) due mapfunzioni in jQuery. La risposta di Thomas Petersen utilizza "Utilities / jQuery.map"; questa risposta usa "Traversing / map" (e quindi un codice un po 'più pulito).

Dipende da cosa hai intenzione di fare con i valori. Se, diciamo, vuoi restituire i valori da una funzione, mapè probabilmente l'alternativa migliore. Ma se hai intenzione di usare i valori direttamente, probabilmente vorrai each.


4
Puoi effettivamente usare this.value invece di $ (this) .val () qui. Saresti anche meglio servito trovando i bambini nel selettore iniziale (opzione #example). Bello alla fine con get () alla fine.
Alex Barrett,

1
@Alex Barret: Beh, è ​​possibile risolvere questo problema senza usare jQuery. Chiamare jQuery con un elemento come argomento avvolgerà semplicemente l'elemento in un oggetto jQuery (cioè nessun attraversamento di alberi, cioè non così costoso). Quindi forse come micro ottimizzazione, sì.
cic

mappa FTW. Questo è esattamente come dovrebbe essere fatto. Get () alla fine sembra non necessario, tuttavia (che restituisce il nodo DOM e val () ci fornisce già una stringa, quindi ...?) Var opts = $ ('opzione # # cm_amt'). Map (function ( ) {return parseInt ($ (this) .val ());});
sbeam,

3
@sbeam: "Poiché il valore restituito è un array avvolto in jQuery, è molto comune che get()l'oggetto restituito funzioni con un array di base." - api.jquery.com/map
cic

Mi ha aiutato molto, ho voluto non il testo il valore, quindi ho solo cambiato a text()posto val(). Grazie ! (Ti ho fatto andare oltre il 1000 ;->)
ParPar il

52
$('select#id').find('option').each(function() {
    alert($(this).val());
});

1
Questo è il ticket, perché mi piace memorizzare gli elementi in cache in variabili su init, piuttosto che usare il selettore.
Doug Beard,

1
Funziona anche con $ (questo) (che è quello che cercava), ad es.
Hugh Seagraves,

16
$("#id option").each(function()
{
    $(this).prop('selected', true);
});

Tuttavia, il modo CORRETTO è impostare la proprietà DOM dell'elemento, in questo modo:

$("#id option").each(function(){
    $(this).attr('selected', true);
});

4
Non sarebbe .attr ('selezionato', 'selezionato')?
v010dya,

16

Questo metterà i valori delle opzioni #myselectboxin una bella matrice pulita per te:

// 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();});

Puoi accorciarlo a:$.map(domelts, elt=> $(elt).val())
Jonno_FTW il

11

Puoi prendere tutti i "valori selezionati" in base al nome delle caselle di controllo e presentarli in una puntura separata da ",".

Un buon modo per farlo è usare $ .map () di jQuery:

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

alert(selected_val);

6
questo codice è piuttosto illeggibile, non lo userei mai anche se è abbastanza bello.
Fai clic su Aggiorna

7
anche la domanda riguarda selecte optionnon le caselle di controllo.
Dementico


3

È possibile utilizzare il seguente codice per questo:

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

2

Per l'opzione di selezione multipla:

$('#test').val()ritorna l'elenco dei valori selezionati. $('#test option').lengthrestituisce il numero totale di opzioni (sia selezionate che non selezionate)


1

Questo è un semplice script con 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>

1

Ecco un semplice esempio in jquery per ottenere tutti i valori, i testi o il valore dell'elemento selezionato o il testo dell'elemento selezionato

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


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

O:

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

Per vedere i risultati:

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

0

Se stai cercando tutte le opzioni con un po 'di testo selezionato, il codice qui sotto funzionerà.

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

0

La via breve

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

o

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;}
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.