Ustaw wybraną opcję pola wyboru

352

Chcę ustawić opcję, która została wcześniej wybrana do wyświetlania przy ładowaniu strony. Próbowałem z następującym kodem:

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

z

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

Ale to nie działa. Jakieś pomysły?

Głosuj
źródło
10
Właściwie tak to powinno działać, czy na pewno ustawiłeś wartość w document.ready ()? Być może kod jest wykonywany, gdy pole wyboru nie jest jeszcze gotowe.
Morph

Odpowiedzi:

495

To zdecydowanie powinno działać. Oto demo . Upewnij się, że umieściłeś swój kod w $(document).ready:

$(function() {
    $("#gate").val('gateway_2');
});
Darin Dimitrov
źródło
4
ok, kiedy rozwijam listę, jest podświetlona, ​​ale nie wyświetlana jako pierwszy element na liście
Upvote
2
ahh Zadeklarowałem, że nie ma go w funkcji gotowości dokumentu ... dzięki!
Głosuj
7
Nie tak dobre, jak ustawienie atrybutu „selected” na „selected”.
Adal
6
@Adal Dlaczego nie jest to tak dobre, jak ustawienie atrybutu „selected” na „selected”?
Shawn
26
Na wypadek, gdyby ktokolwiek się zastanawiał, 'Gateway 2'przekazana do funkcji valodpowiada wartości valueatrybutu opcji select, a nie jej tekstowi. Zobacz ten JSFiddle , który jest bardzo łagodnie zredagowaną wersją dema Darina, na przykład, co mam na myśli.
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
});
Zkoh
źródło
37

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

Marty Hirsch
źródło
2
Bardzo podobny do tego, $('#your-select-box-id :nth-child(2)').prop('selected', true)który działa, z wizualną aktualizacją listy rozwijanej.
Big Rich
Tylko jeden, który dla mnie zadziałał. Podejrzewam, ponieważ używam niestandardowej biblioteki wyboru.
Louis M.,
15

Odkryłem, że użycie metody jQuery .val () ma znaczną wadę.

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

Jeśli to pole wyboru (lub jakikolwiek inny obiekt wejściowy) ma formę i w formularzu jest używany przycisk resetowania, po kliknięciu przycisku resetowania ustawiona wartość zostanie wyczyszczona i nie będzie resetowana do wartości początkowej, jak można się spodziewać.

Wydaje mi się, że to działa najlepiej.

Dla Wybierz pola

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

Do wprowadzania tekstu

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

Do wprowadzania tekstu

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

Dla pól wyboru

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

Do przycisków radiowych

<input type="radio" id="gate" value="this"/> or <input type="radio" id="gate" value="that"/>
$("#gate[value='this']").attr("checked", true);
Mikrofon
źródło
12
  $("#form-field").val("5").trigger("change");
Mohd Bashir
źródło
1
Byłoby miło, gdybyś podał jakieś informacje na ten temat. Jest to świetny przykład tego, jak POWINIENEś to zrobić, JEŻELI masz kod, który obserwuje zmiany w zaznaczeniu.
sean.boyer
6

To działa dobrze. Zobacz to skrzypce: http://jsfiddle.net/kveAL/

Możliwe, że musisz zadeklarować swoje jQuery w $(document).ready() obsługi?

Ponadto, czy możesz mieć dwa elementy, które mają ten sam identyfikator?

James Wiseman
źródło
6

To byłaby kolejna opcja:

$('.id_100 option[value=val2]').prop('selected', true);
Kent Aguilar
źródło
6

Miałem ten sam problem.

Rozwiązanie: dodaj odświeżenie.

$("#gate").val('Gateway 2');
$("#gate").selectmenu('refresh');
Wysłano
źródło
3
to jest tylko dla jqueryui selectmenu, a nie standardowy HTML
stuartdotnet
3

Wiem, że istnieje kilka iteracji odpowiedzi, ale teraz nie wymaga to jquery ani żadnej innej biblioteki zewnętrznej i można to zrobić dość łatwo, wykonując następujące czynności.

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>

SyWill
źródło
świetne rozwiązanie. ale wygląda na to, że nie usuwa wybranego atrybutu z wcześniej wybranych opcji
Rebooter systemów
3

Niektóre przypadki mogą być

$('#gate option[value='+data.Gateway2+']').attr('selected', true);
hemil
źródło
1

Mój problem

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

Miałem ten sam problem. Jedyną różnicą w stosunku do twojego kodu jest to, że ładowałem pole wyboru przez wywołanie ajax i gdy tylko wywołanie ajax zostało wykonane, ustawiłem domyślną wartość pola wyboru

Rozwiązanie

get_courses();
   setTimeout(function() {
     $("#course").val(course);
  }, 10);
Korah
źródło
1
przeanalizowałeś problem poprawnie, ale rozwiązanie jest złe i kruche. musisz użyć funkcji zwrotnej dołączonej do wywołania ajax
icksde
-1

Miałem problem polegający na tym, że wartość nie została ustawiona z powodu błędu składniowego przed wywołaniem.

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

Przed połączeniem sprawdź błędy składniowe.

Howard
źródło
4
Mimo, że należy pamiętać o sprawdzaniu błędów składniowych, nie jest to odpowiedź.
Strzelba Ninja
-1
$(function() {
$("#demo").val('hello');
});
Gaurav Rai
źródło
-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');
});
Ronnel Castillo Ocampo
źródło
1
Spowoduje to zapętlenie nawet powyżej wybranej wartości, która jest nieefektywna
Daniel Nuriyev
Plus .attr()był niewłaściwym sposobem na zrobienie tego na długo przed opublikowaniem tej odpowiedzi.
Auspex
-2

Dodatek do @icksde i @Korah (dzięki obu!)

Podczas budowania opcji za pomocą AJAX, document.ready może zostać uruchomiony przed zbudowaniem listy, więc

To nie działa

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

To robi

Limit czasu działa, ale jak @icksde mówi, że jest delikatny (faktycznie potrzebowałem 20 ms zamiast 10 ms). Lepiej jest zmieścić go w funkcji AJAX w następujący sposób:

$("#someObject").change(function() {
    $.get("website/page.php", {parameters}, function(data) {
        $("#gate").append("<option value='Gateway 2'">" + "Gateway 2" + "</option>");
        $("#gate").val('Gateway 2');
    }, "json");
});
Cor Koomen
źródło