Come si seleziona una particolare opzione in un elemento SELECT in jQuery?


718

Se conosci l'indice, il valore o il testo. anche se non si dispone di un ID per un riferimento diretto.

Questo , questo e questo sono tutte risposte utili.

Esempio di markup

<div class="selDiv">
  <select class="opts">
    <option selected value="DEFAULT">Default</option>
    <option value="SEL1">Selection 1</option>
    <option value="SEL2">Selection 2</option>
  </select>
</div>

46
$("#my_select").val("the_new_value").change();... ... da così
dsdsdsdsd,

Risposte:


1206

Un selettore per ottenere l'elemento-opzione centrale in base al valore è

$('.selDiv option[value="SEL1"]')

Per un indice:

$('.selDiv option:eq(1)')

Per un testo noto:

$('.selDiv option:contains("Selection 1")')

MODIFICA : Come commentato sopra, l'OP potrebbe essere stato dopo aver modificato l'elemento selezionato del menu a discesa. Nella versione 1.6 e successive si consiglia il metodo prop ():

$('.selDiv option:eq(1)').prop('selected', true)

Nelle versioni precedenti:

$('.selDiv option:eq(1)').attr('selected', 'selected')

EDIT2 : dopo il commento di Ryan. Una partita su "Selezione 10" potrebbe essere indesiderata. Non ho trovato alcun selettore che corrisponda al testo completo, ma un filtro funziona:

 $('.selDiv option')
    .filter(function(i, e) { return $(e).text() == "Selection 1"})

EDIT3 : usare cautela $(e).text()poiché può contenere una nuova riga che impedisce il confronto. Questo succede quando le opzioni sono implicitamente chiuse (nessun </option>tag):

<select ...>
<option value="1">Selection 1
<option value="2">Selection 2
   :
</select>

Se si utilizza semplicemente e.textuno spazio bianco aggiuntivo come la nuova riga finale verrà rimosso, rendendo il confronto più solido.


8
: contiene non è eccezionale in quanto corrisponderà a pezzi di testo; problematico se il testo dell'opzione è una sottostringa di un altro testo dell'opzione.
Ryan,

26
Funziona troppo $ ('# id opzione [valore = "0"]'). Attr ('selezionato', 'selezionato');
DevC

@Grastveit come cambiare il colore della prima opzione se è selezionata o meno quando ha una classe dire myClass. Grazie
Zaker,

@Utente non capisco. Forse pubblicarlo in una nuova domanda? O è $ ('. SelDiv .myClass'). Css ('color', 'red')?
Grastveit,

6
Vorrei aggiungerti se DEFINITAMENTE usi prop e non attr. Sono quasi impazzito nel tentativo di eseguire il debug di un'applicazione e il passaggio da attr a prop ha risolto il problema.
user609926

125

Nessuno dei metodi di cui sopra ha fornito la soluzione di cui avevo bisogno, quindi ho pensato che avrei fornito ciò che ha funzionato per me.

$('#element option[value="no"]').attr("selected", "selected");

10
Nota a partire da jQuery 1.6 questo dovrebbe essere usato prope non attr.
Codice finito

@GoneCoding L'utilizzo .attrè corretto. "selected" è un attributo di <option> w3.org/TR/html5/forms.html#attr-option-selected
Carlos Llongo,

3
@CarlosLlongo: questo è irrilevante. La raccomandazione di jQuery è di usare sempre propin preferenza attr. Ciò evita di dover cercare tutte le proprietà su w3.org per vedere se è solo un attributo o implementato con azioni di supporto.
Codice finito

82

Puoi semplicemente usare il val()metodo:

$('select').val('the_value');

20
Questo è errato perché stai impostando il valore di TUTTI gli elementi SELECT su the_value. .val non è la funzione di selezione / filtro! È un accedente della proprietà e gli passa quella stringa IMPOSTA il valore. Ho provato a riprendere il mio voto, ma era troppo tardi dopo averlo realizzato nei test.
AaronLS,

4
Hai ottenuto 10 voti come risposta utile? Il val () è un getter e un setter. Se usi solo val (), otterrai il valore. Se passi qualcosa come val ('the_value') lo stai impostando su 'the_value'
Gui

12
Si prega di @AaronLS e @guilhermeGeek, fare riferimento ai documenti (ultimo esempio). Funziona come un selettore per selezionare, caselle di controllo e pulsanti di opzione e come settatore di valori per input di testo e aree di testo.
Leandro Ardissone,

9
Hai letto male la documentazione. Per le caselle di controllo, le radio e le caselle di riepilogo, il comando imposta l'attributo "selezionato" per tali elementi. L'ultimo esempio mostra come passare val ("checkbox 1") fa sì che venga selezionato. Questo non è lo stesso di un "selettore" in termini di ottenere gli oggetti tramite il selettore CSS / jquery. Ho testato il tuo codice, non funziona in fondo.
AaronS

27
+1: no, non è un selettore JQuery, tuttavia penso che la maggior parte delle persone che cercano questa domanda siano come me e vogliono semplicemente cambiare l'opzione attualmente selezionata; trovare un vero selettore è semplicemente un modo per farlo. E questo è sicuramente meglio delle risposte che ho visto che ti hanno ripetuto su tutte le opzioni.
kdgregory,

57

Per valore, ciò che ha funzionato per me con jQuery 1.7 era il codice seguente, prova questo:

$('#id option[value=theOptionValue]').prop('selected', 'selected').change();

5
Non sono sicuro che tu abbia bisogno del metodo .change ().
Phillip Senn,

6
L' .change()era necessario. Ho avuto un esempio in cui stavo cambiando le anteprime in base a un SELECT. Quando ho caricato un tema personalizzato, doveva selezionare "Tema personalizzato" dall'elenco di opzioni. La .prop()chiamata ha funzionato, ma senza l' .change()immagine in miniatura sulla destra della mia selezione non è mai stata aggiornata.
Volomike,

2
.change () è stato il miglior consiglio. +1
Ja8zyjits,

1
Nota: un propvalore booleano genera lo stesso output. es..prop('selected', true)
Gone Coding

Dipende, alcuni browser - forse vecchi browser - hanno bisogno della stringa "selezionata". Penso che la maggior parte di essi supporti la stringa di testo.
mpoletto,

16

Esistono diversi modi per farlo, ma l'approccio più pulito è stato perso tra le risposte migliori e molte discussioni val(). Inoltre alcuni metodi sono stati modificati a partire da jQuery 1.6, quindi è necessario un aggiornamento.

Per i seguenti esempi supporrò che la variabile $selectsia un oggetto jQuery che punta al <select>tag desiderato , ad esempio tramite quanto segue:

var $select = $('.selDiv .opts');

Nota 1: utilizzare val () per le corrispondenze di valori:

Per la corrispondenza dei valori, l'utilizzo val()è molto più semplice rispetto all'utilizzo di un selettore di attributi: https://jsfiddle.net/yz7tu49b/6/

$select.val("SEL2");

La versione setter di .val()è implementata sui selecttag impostando la selectedproprietà di una corrispondenza optioncon la stessavalue , quindi funziona perfettamente su tutti i browser moderni.

Nota 2 - usa prop ('selezionato', vero):

Se si desidera impostare direttamente lo stato selezionato di un'opzione, è possibile utilizzare prop(non attr) con un booleanparametro (anziché il valore del testoselected ):

ad es. https://jsfiddle.net/yz7tu49b/

$option.prop('selected', true);  // Will add selected="selected" to the tag

Nota 3 - consentire valori sconosciuti:

Se si utilizza val()per selezionare un <option>, ma la val non corrisponde (potrebbe accadere a seconda della fonte dei valori), allora "nulla" è selezionato e $select.val()restituirànull .

Quindi, per l'esempio mostrato, e per motivi di robustezza, potresti usare qualcosa del genere https://jsfiddle.net/1250Ldqn/ :

var $select = $('.selDiv .opts');
$select.val("SEL2");
if ($select.val() == null) {
  $select.val("DEFAULT");
}

Nota 4 - corrispondenza esatta del testo:

Se si desidera abbinare il testo esatto, è possibile utilizzare una filterfunzione with. ad es. https://jsfiddle.net/yz7tu49b/2/ :

var $select = $('.selDiv .opts');
$select.children().filter(function(){
    return this.text == "Selection 2";
}).prop('selected', true);

anche se se si dispone di spazi bianchi extra è possibile che si desideri aggiungere un taglio al controllo come in

    return $.trim(this.text) == "some value to match";

Nota 5: corrispondenza per indice

Se vuoi abbinare per indice basta indicizzare i figli della selezione es. Https://jsfiddle.net/yz7tu49b/3/

var $select = $('.selDiv .opts');
var index = 2;
$select.children()[index].selected = true;

Anche se tendo ad evitare le proprietà DOM dirette a favore di jQuery al giorno d'oggi, a codice a prova di futuro, in modo che possa essere fatto anche come https://jsfiddle.net/yz7tu49b/5/ :

var $select = $('.selDiv .opts');
var index = 2;
$select.children().eq(index).prop('selected', true);

Nota 6: utilizzare change () per attivare la nuova selezione

In tutti i casi precedenti, l'evento change non si attiva. Questo è in base alla progettazione in modo da non finire con eventi di cambiamento ricorsivo.

Per generare l'evento change, se necessario, basta aggiungere una chiamata all'oggetto .change()jQuery select. ad esempio il primo esempio più semplice diventa https://jsfiddle.net/yz7tu49b/7/

var $select = $('.selDiv .opts');
$select.val("SEL2").change();

Ci sono anche molti altri modi per trovare gli elementi usando selettori di attributi, come [value="SEL2"], ma devi ricordare che i selettori di attributi sono relativamente lenti rispetto a tutte queste altre opzioni.


13

È possibile nominare la selezione e utilizzare questo:

$("select[name='theNameYouChose']").find("option[value='theValueYouWantSelected']").attr("selected",true);

Dovrebbe selezionare l'opzione desiderata.


12
   $(elem).find('option[value="' + value + '"]').attr("selected", "selected");

Grazie per il tuo post, ma cosa aggiunge questa risposta alla conversazione che non è inclusa nelle risposte accettate?
Edward,

se esiste un'opzione già selezionata, ciò non riuscirà poiché un menu a discesa non può avere più di un elemento selezionato a meno che non sia una selezione multipla. Devi fare .prop ('selezionato', vero)
derekcohen

9

Rispondere alla mia domanda di documentazione. Sono sicuro che ci sono altri modi per farlo, ma funziona e questo codice è testato.

<html>
<head>
<script language="Javascript" src="javascript/jquery-1.2.6.min.js"></script>
<script type="text/JavaScript">

$(function() {
    $(".update").bind("click",      // bind the click event to a div
        function() {
            var selectOption = $('.selDiv').children('.opts') ;
            var _this = $(this).next().children(".opts") ;

            $(selectOption).find("option[index='0']").attr("selected","selected");
//          $(selectOption).find("option[value='DEFAULT']").attr("selected","selected");
//          $(selectOption).find("option[text='Default']").attr("selected","selected");


//          $(_this).find("option[value='DEFAULT']").attr("selected","selected");
//          $(_this).find("option[text='Default']").attr("selected","selected");
//          $(_this).find("option[index='0']").attr("selected","selected");

    }); // END Bind
}); // End eventlistener

</script>
</head>
<body>
<div class="update" style="height:50px; color:blue; cursor:pointer;">Update</div>
<div class="selDiv">
        <select class="opts">
            <option selected value="DEFAULT">Default</option>
            <option value="SEL1">Selection 1</option>
            <option value="SEL2">Selection 2</option>
        </select>
    </div>
</body>
</html>

9

Esattamente funzionerà provare questi metodi di seguito

Per l'opzione di selezione normale

<script>    
    $(document).ready(function() {
    $("#id").val('select value here');
       });
        </script>

Per selezionare l'opzione 2 l'opzione trigger è necessario utilizzare

<script>    
        $(document).ready(function() {
        $("#id").val('select value here').trigger('change');
           });
            </script>


8

Per impostare il valore selezionato con l'attivazione selezionata:

$('select.opts').val('SEL1').change();

Per impostare un'opzione da un ambito:

$('.selDiv option[value="SEL1"]')
    .attr('selected', 'selected')
    .change();

Questo codice usa il selettore per scoprire l'oggetto select con condizione, quindi cambia l'attributo selezionato di attr().


Inoltre, raccomando di aggiungere un change()evento dopo aver impostato l'attributo selected, in questo modo il codice si chiuderà cambiando selezione per utente.


6

Lo uso quando conosco l'indice dell'elenco.

$("#yourlist :nth(1)").prop("selected","selected").change();

Ciò consente all'elenco di cambiare e genera l'evento change. ": Nth (n)" sta contando dall'indice 0


5

andrò con: -

$("select#my-select option") .each(function() { this.selected = (this.text == myVal); });

5

Prova questo

basta usare id campo di selezione invece di #id (es. # nome_selezione)

invece del valore dell'opzione usa il valore dell'opzione selezionata

 <script>
    $(document).ready(function() {
$("#id option[value='option value']").attr('selected',true);
   });
    </script>

3

Per Jquery scelto se si invia l'attributo per funzionare e occorre aggiornare l'opzione di selezione

$('#yourElement option[value="'+yourValue+'"]').attr('selected', 'selected');
$('#editLocationCity').chosen().change();
$('#editLocationCity').trigger('liszt:updated');

3
/* This will reset your select box with "-- Please Select --"   */ 
    <script>
    $(document).ready(function() {
        $("#gate option[value='']").prop('selected', true);
    });
    </script>

1

La $('select').val('the_value');sembra la soluzione giusta e se si dispone di righe della tabella dei dati allora:

$row.find('#component').val('All');

1

se non si desidera utilizzare jQuery, è possibile utilizzare il codice seguente:

document.getElementById("mySelect").selectedIndex = "2";

1

Grazie per la domanda Spero che questo pezzo di codice funzioni per te.

var val = $("select.opts:visible option:selected ").val();

0
$('#select option[data-id-estado="3"]').prop("selected",true).trigger("change");

o

$('#select option[value="myValue"]').prop("selected",true).trigger("change");

Modifica la tua risposta in modo che il codice sia formattato come codice. Per fare ciò, utilizzare la barra degli strumenti o semplicemente rientrare di quattro spazi tutte le righe di ciascun blocco di codice.
beruic,
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.