Imposta l'opzione selezionata della casella di selezione


352

Voglio impostare un'opzione che è stata selezionata in precedenza per essere visualizzata al caricamento della pagina. L'ho provato con il seguente codice:

$("#gate").val('Gateway 2');

con

<select id="gate">
    <option value='null'>- choose -</option>
    <option value='gateway_1'>Gateway 1</option>
    <option value='gateway_2'>Gateway 2</option>
</select>

Ma questo non funziona. Qualche idea?


10
In realtà è così che dovrebbe funzionare, sei sicuro di aver impostato il valore in document.ready ()? Forse il codice viene eseguito quando la casella di selezione non è ancora pronta.
— Morph,

Risposte:


496

Questo sicuramente dovrebbe funzionare. Ecco una demo . Assicurati di aver inserito il codice in un $(document).ready:

$(function() {
    $("#gate").val('gateway_2');
});

4
ok, quando lascio cadere l'elenco è evidenziato ma non visualizzato come primo elemento dell'elenco
— Voto

2
ahh l'ho dichiarato non nella funzione documento pronto ... grazie!
— Votazione del

7
Non buono come impostare l'attributo "selezionato" su "selezionato".
— Adal,

6
@Adal Perché questo non è buono come impostare l'attributo 'selezionato' su 'selezionato'?
— Shawn,

26
Nel caso in cui qualcuno si chieda, il 'Gateway 2'passaggio alla funzione valcorrisponde al valore valuedell'attributo dell'opzione select, non al suo testo. Guarda questo JSFiddle , che è una versione leggermente modificata della demo di Darin, per un esempio di ciò che intendo.
— Kenny Evitt,

166
$(document).ready(function() {
    $("#gate option[value='Gateway 2']").prop('selected', true);
    // you need to specify id of combo to set right combo, if more than one combo
});

37

$('#gate').val('Gateway 2').prop('selected', true);


2
Molto simile a quello $('#your-select-box-id :nth-child(2)').prop('selected', true)che funziona, con aggiornamento visivo della casella di riepilogo.
— Big Rich

Solo uno che ha funzionato per me. Sospetto perché sto usando una libreria di selezione personalizzata.
— Louis M.,

15

Ho scoperto che usando il metodo jQuery .val () si ha un inconveniente significativo.

<select id="gate"></select>
$("#gate").val("Gateway 2");

Se questa casella di selezione (o qualsiasi altro oggetto di input) è in un modulo e viene utilizzato un pulsante di ripristino nel modulo, quando si fa clic sul pulsante di ripristino, il valore impostato verrà cancellato e non ripristinato al valore iniziale come previsto.

Questo sembra funzionare al meglio per me.

Per le caselle Seleziona

<select id="gate"></select>
$("#gate option[value='Gateway 2']").attr("selected", true);

Per input di testo

<input type="text" id="gate" />
$("#gate").attr("value", "your desired value")

Per input textarea

<textarea id="gate"></textarea>
$("#gate").html("your desired value")

Per caselle di controllo

<input type="checkbox" id="gate" />
$("#gate option[value='Gateway 2']").attr("checked", true);

Per i pulsanti di opzione

<input type="radio" id="gate" value="this"/> or <input type="radio" id="gate" value="that"/>
$("#gate[value='this']").attr("checked", true);

12
  $("#form-field").val("5").trigger("change");

1
Sarebbe stato bello se tu avessi incluso alcune informazioni al riguardo. Questo è un ottimo esempio di come DOVREBBE farlo, SE hai un codice che sta osservando le modifiche alla selezione.
— sean.boyer,

6

Funziona benissimo. Vedi questo violino: http://jsfiddle.net/kveAL/

È possibile che tu debba dichiarare il tuo jQuery in un $(document).ready()gestore?

Inoltre, potresti avere due elementi con lo stesso ID?


6

Questa sarebbe un'altra opzione:

$('.id_100 option[value=val2]').prop('selected', true);

6

Ho avuto lo stesso problema.

Soluzione: aggiungere un aggiornamento.

$("#gate").val('Gateway 2');
$("#gate").selectmenu('refresh');

3
questo è solo per jqueryui selectmenu, non standard html
— stuartdotnet

3

So che ci sono diverse iterazioni di risposte, ma ora questo non richiede jquery o qualsiasi altra libreria esterna e può essere realizzato abbastanza facilmente solo con quanto segue.

document.querySelector("#gate option[value='Gateway 2']").setAttribute('selected',true);
<select id="gate">
    <option value='null'>- choose -</option>
    <option value='Gateway 1'>Gateway 1</option>
    <option value='Gateway 2'>Gateway 2</option>
</select>


ottima soluzione. ma sembra che non rimuova l'attributo selezionato dalle opzioni precedentemente selezionate
— Rebooter del sistema

3

Alcuni casi potrebbero essere

$('#gate option[value='+data.Gateway2+']').attr('selected', true);

1

Il mio problema

get_courses(); //// To load the course list
$("#course").val(course); //// Setting default value of the list

Ho avuto lo stesso problema. L'unica differenza dal tuo codice è che stavo caricando la casella di selezione tramite una chiamata ajax e non appena la chiamata ajax è stata eseguita, ho impostato il valore predefinito della casella di selezione

La soluzione

get_courses();
   setTimeout(function() {
     $("#course").val(course);
  }, 10);

1
hai analizzato il problema correttamente, ma la soluzione è difettosa e fragile. devi usare una funzione di callback allegata alla tua chiamata ajax
— icksde

-1

Ho avuto un problema in cui il valore non era impostato a causa di un errore di sintassi prima della chiamata.

$("#someId").value(33); //script bailed here without showing any errors Note: .value instead of .val
$("#gate").val('Gateway 2'); //this line didn't work.

Verificare la presenza di errori di sintassi prima della chiamata.


4
Per quanto sia utile ricordare di verificare la presenza di errori di sintassi, questa non è una risposta.
— Fucile Ninja


-2
// Make option have a "selected" attribute using jQuery

var yourValue = "Gateway 2";

$("#gate").find('option').each(function( i, opt ) {
    if( opt.value === yourValue ) 
        $(opt).attr('selected', 'selected');
});

1
Questo passerà anche oltre il valore selezionato, che è inefficiente
— Daniel Nuriyev,

Plus .attr()è stato il modo sbagliato di farlo da molto prima che questa risposta fosse pubblicata.
— Auspex,

-2

Aggiunta a @icksde e @Korah (grazie entrambi!)

Quando si creano le opzioni con AJAX, è possibile che il documento sia già attivato prima della creazione dell'elenco, quindi

Questo non funziona

$(document).ready(function() {
    $("#gate").val('Gateway 2');
});

Questo fa

Un timeout funziona ma come dice @icksde è fragile (in realtà avevo bisogno di 20 ms invece di 10 ms). È meglio inserirlo nella funzione AJAX in questo modo:

$("#someObject").change(function() {
    $.get("website/page.php", {parameters}, function(data) {
        $("#gate").append("<option value='Gateway 2'">" + "Gateway 2" + "</option>");
        $("#gate").val('Gateway 2');
    }, "json");
});
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.