jQuery Set Wybierz indeks

259

Mam zaznaczone pole:

<select id="selectBox">
  <option value="0">Number 0</option>
  <option value="1">Number 1</option>
  <option value="2">Number 2</option>
  <option value="3">Number 3</option>
  <option value="4">Number 4</option>
  <option value="5">Number 5</option>
  <option value="6">Number 6</option>
  <option value="7">Number 7</option>
</select>

Chciałbym ustawić jedną z opcji jako „wybraną” na podstawie wybranego indeksu.

Na przykład, jeśli próbuję ustawić „Numer 3”, próbuję tego:

$('#selectBox')[3].attr('selected', 'selected');

Ale to nie działa. Jak ustawić wybraną opcję na podstawie jej indeksu za pomocą jQuery?

Dzięki!

BoltClock
źródło
2
Jest to prawie dokładnie to samo, co poprzednie pytanie: stackoverflow.com/questions/1280369/…
Kobi

Odpowiedzi:

451

UWAGA : odpowiedź zależy od jQuery 1.6.1+

$('#selectBox :nth-child(4)').prop('selected', true); // To select via index
$('#selectBox option:eq(3)').prop('selected', true);  // To select via value

Dzięki za komentarz, .getnie zadziała, ponieważ zwraca element DOM, a nie element jQuery. Pamiętaj, że .eqfunkcja może być używana również poza selektorem, jeśli wolisz.

$('#selectBox option').eq(3).prop('selected', true);

Możesz także być bardziej zwięzły / czytelny, jeśli chcesz użyć tej wartości , zamiast polegać na wyborze konkretnego indeksu :

$("#selectBox").val("3");

Uwaga: .val(3) działa również w tym przykładzie, ale wartości nienumeryczne muszą być łańcuchami, więc wybrałem ciąg dla zachowania spójności.
(np. <option value="hello">Number3</option>wymaga użycia .val("hello"))

Marc
źródło
7
+1 - Druga opcja działała dla mnie. Wybrana odpowiedź Johna Kugelmana nie działała dla mnie w IE7.
P.Brian.Mackey
2
Niestety, żaden z tych sposobów nie wywołuje dla mnie zdarzenia change (). Mam $ ('# selectBox'). Change (function () {alert ('zmianie')});
Mike Jones
28
@mikejones - to z założenia. Kiedy programowo ustawiasz wybraną opcję, nie zawsze możesz chcieć, aby wywołane zdarzenie zmiany było wyzwalane (jak w przypadku zdarzenia ładowania strony). Rozwiązanie tego jquery pozostawia programistom decyzję. W twoim przypadku możesz po prostu wywołać $ ('# selectBox'). Change (); po wywołaniu $ ('# selectBox'). val („3”);
Marcus Pope
2
Czy pierwsza opcja to 0 czy 1?
Lee Meador
3
Myślałem, że to warto wspomnieć, że post-jQuery 1.6.1, zalecana metoda modyfikowania właściwości logicznych elementu jest .prop()raczej niż .attr().
DevlshOne
113

Może to również być przydatne, więc pomyślałem, że dodam go tutaj.

Jeśli chcesz wybrać wartość na podstawie wartości elementu, a nie jego indeksu, możesz wykonać następujące czynności:

Twoja wybrana lista:

<select id="selectBox">
    <option value="A">Number 0</option>
    <option value="B">Number 1</option>
    <option value="C">Number 2</option>
    <option value="D">Number 3</option>
    <option value="E">Number 4</option>
    <option value="F">Number 5</option>
    <option value="G">Number 6</option>
    <option value="H">Number 7</option>
</select>

Jquery:

$('#selectBox option[value=C]').attr('selected', 'selected');

$('#selectBox option[value=C]').prop('selected', true);

Wybrany element będzie teraz „numerem 2”.

dnoxs
źródło
uwaga: po $ () jest dodatkowy znak podkreślenia ... w przeciwnym razie działa to fantastycznie
Dusty J
1
+1 Nie mogłem sprawić, żeby działało dokładnie, ale w końcu sprawiłem, że działało z następującą składnią: $ ("# selectBox opcja [wartość = 'C']") [0] .selected = true;
Wes Grant
5
Należy pamiętać, że .attr('selected', 'selected')nie należy go używać kilka razy w tym samym zaznaczeniu, ponieważ niektóre przeglądarki mogą się mylić (w niektórych przypadkach zaczynają oznaczać kilka pozycji w domenie jako selected=selected". Jeśli musisz częściej zmieniać wybraną wartość (np. Na przycisku) kliknij) użyj .prop('selected', true)zgodnie z sugestią Marc. - Po prostu miał dużo bólu - i zmarnował czas - z powodu tego problemu!
Tom Fink
66

Spróbuj zamiast tego:

$("#selectBox").val(3);
Chris Brandsma
źródło
2
To sprawia, że ​​kopiowanie z jednego elementu do drugiego jest również bardzo proste!
Sonny,
literówka: po „selectBox nie masz cytatu
Niels Bom
1
To jest proste i jednoznaczne. Wolę to rozwiązanie.
Dan Bailiff
Działa to w Chrome, ale nie działa dla mnie z IE9. Używam: $ („# selectBox option”) [3] .selected = true; (odpowiedź seans).
cederlof
FWIW, To nawet nie działa w Chrome dla mnie. Użycie odpowiedzi „: nth-child” zadziałało dla mnie.
Jay Taylor
50

Jeszcze prościej:

$('#selectBox option')[3].selected = true;
Sean
źródło
1
To działało dla mnie, musiałem również wybrać INDEX, a nie WARTOŚĆ.
Alan
1
Ta odpowiedź dała mi to, czego potrzebowałem. Brakowało mi części „opcji” selektora podczas próby wyboru według nazwy $ („select [name =" select_name ”] opcja) [index] .selected = true;
Smith Smithy,
16
# Set element with index
$("#select option:eq(2)").attr("selected", "selected");

# Set element by text
$("#select").val("option Text").attr("selected", "selected");

gdy chcesz dokonać wyboru za pomocą najlepszych sposobów wyboru zestawu, możesz użyć
$('#select option').removeAttr('selected');do usunięcia poprzednich zaznaczeń.

# Set element by value
$("#select").val("2");

# Get selected text
$("#select").children("option:selected").text();  # use attr() for get attributes
$("#select option:selected").text(); # use attr() for get attributes 

# Get selected value
$("#select option:selected").val();
$("#select").children("option:selected").val();
$("#select option:selected").prevAll().size();
$("option:selected",this).val();

# Get selected index
$("#select option:selected").index();
$("#select option").index($("#select option:selected"));

# Select First Option
$("#select option:first");

# Select Last Item
$("#select option:last").remove();


# Replace item with new one
$("#select option:eq(1)").replaceWith("<option value='2'>new option</option>");

# Remove an item
$("#select option:eq(0)").remove();
M. Rostami
źródło
+1 za: $ („# select option”). RemoveAttr („selected”); najprostsza opcja powrotu „wybranego” elementu do góry lub brak zdefiniowanego wyboru.
Michael Trouw
11

Ważne jest, aby zrozumieć, że val()dla selectelementu zwraca wartość wybranej opcji, ale nie liczbę elementów, jak selectedIndexw javascript.

Aby wybrać opcję value="7", możesz po prostu użyć:

$('#selectBox').val(7); //this will select the option with value 7.

Aby odznaczyć opcję, użyj pustej tablicy:

$('#selectBox').val([]); //this is the best way to deselect the options

I oczywiście możesz wybrać wiele opcji *:

$('#selectBox').val([1,4,7]); //will select options with values 1,4 and 7

* Jednak aby wybrać wiele opcji, <select>element musi mieć MULTIPLEatrybut, w przeciwnym razie nie będzie działać.

Anonimowy
źródło
11

Zawsze miałem problemy z prop („wybrane”), zawsze działały dla mnie następujące rzeczy:

//first remove the current value
$("#selectBox").children().removeAttr("selected");
$("#selectBox").children().eq(index).attr('selected', 'selected');
hellojebus
źródło
8

Spróbuj tego:

$('select#mySelect').prop('selectedIndex', optionIndex);

W końcu uruchom zdarzenie .change:

$('select#mySelect').prop('selectedIndex', optionIndex).change();
NicolasBernier
źródło
6

Mam nadzieję, że to może pomóc

$('#selectBox option[value="3"]').attr('selected', true);
Andrzej
źródło
5

wybierz trzecią opcję

$('#selectBox').val($('#selectBox option').eq(2).val());

Przykład na jsfiddle

dabar
źródło
4

NB:

$('#selectBox option')[3].attr('selected', 'selected') 

jest niepoprawny, szacunek do tablicy daje ci obiekt dom, a nie obiekt jquery, więc zawiedzie z TypeError, na przykład w FF z: „$ ('# opcja selectBox') [3] .attr () nie jest funkcją . ”

slh777
źródło
4

Aby wyjaśnić odpowiedzi Marca i Johna Kugelmana, możesz użyć:

$('#selectBox option').eq(3).attr('selected', 'selected')

get() nie będzie działać, jeśli zostanie użyty w określony sposób, ponieważ pobiera obiekt DOM, a nie obiekt jQuery, więc następujące rozwiązanie nie będzie działać:

$('#selectBox option').get(3).attr('selected', 'selected')

eq()pobiera filtry zestaw jQuery do tego elementu o określonym indeksie. To jest wyraźniejsze niż $($('#selectBox option').get(3)). To nie jest tak wydajne. $($('#selectBox option')[3])jest bardziej wydajny (patrz przypadek testowy ).

Jednak tak naprawdę nie potrzebujesz obiektu jQuery. To załatwi sprawę:

$('#selectBox option')[3].selected = true;

http://api.jquery.com/get/

http://api.jquery.com/eq/

Jeszcze jeden niezwykle ważny punkt:

Atrybut „selected” nie określa sposobu wyboru wybranego przycisku opcji (przynajmniej w przeglądarce Firefox i Chrome). Użyj atrybutu „zaznaczone”:

$('#selectBox option')[3].checked = true;

To samo dotyczy pól wyboru.

Spycho
źródło
4

W 1.4.4 pojawia się błąd: $ („# opcja selectBox”) [3] .attr nie jest funkcją

To działa: $('#name option:eq(idx)').attr('selected', true);

Gdzie #namejest select id i idxwartość opcji, którą chcesz wybrać.

Micheasz Fletcher
źródło
4

Atrybut selectedIndex czystego javascript jest właściwą drogą, ponieważ jest to czysty javascript i działa w różnych przeglądarkach:

$('#selectBox')[0].selectedIndex=4;

Oto demo jsfiddle z dwoma listami rozwijanymi używającymi jednego do ustawienia drugiego:

<select onchange="$('#selectBox')[0].selectedIndex=this.selectedIndex">
  <option>0</option>
  <option>1</option>
  <option>2</option>
</select>

<select id="selectBox">
  <option value="0">Number 0</option>
  <option value="1">Number 1</option>
  <option value="2">Number 2</option>
</select>

Możesz to również wywołać przed zmianą selectedIndex, jeśli chcesz atrybutu „selected” na tagu opcji ( tutaj jest skrzypce ):

$('#selectBox option').removeAttr('selected')
   .eq(this.selectedIndex).attr('selected','selected');
jacmkno
źródło
2
//funcion para seleccionar por el text del select
var text = '';
var canal = ($("#name_canal").val()).split(' ');
$('#id_empresa option').each(function(i, option) {
        text = $('#id_empresa option:eq('+i+')').text();
        if(text.toLowerCase() == canal[0].toLowerCase()){
            $('#id_empresa option:eq('+i+')').attr('selected', true);
        }
    });
andrwsv
źródło
2

Często używam wyzwalacza („zmiany”), aby działał

$('#selectBox option:eq(position_index)').prop('selected', true).trigger('change');

Przykład z id select = selectA1 i position_index = 0 (pierwsza opcja w select):

$('#selectA1 option:eq(0)').prop('selected', true).trigger('change');
Ly Thanh Ngo
źródło
1
$('#selectBox option').get(3).attr('selected', 'selected')

Korzystając z powyższego, ciągle pojawiały się błędy w zestawie internetowym (Chrome), mówiąc:

„Błąd typu Uncaught TypeError: Object # nie ma metody„ attr ””

Ta składnia zatrzymuje te błędy.

$($('#selectBox  option').get(3)).attr('selected', 'selected');
uprzejmość
źródło
1

Wybierz element na podstawie wartości z listy wyboru (szczególnie jeśli wartości opcji zawierają spację lub dziwny znak), wykonując następujące czynności:

$("#SelectList option").each(function () {
    if ($(this).val() == "1:00 PM")
        $(this).attr('selected', 'selected');
});

Ponadto, jeśli masz listę rozwijaną (w przeciwieństwie do wielokrotnego wyboru), możesz chcieć to zrobić, break;aby nie zastąpić znalezionej pierwszej wartości.

Nexxas
źródło
1

Potrzebuję rozwiązania, które nie ma na stałe wartości w pliku js; za pomocą selectedIndex. Większość podanych rozwiązań zawiodła jedną przeglądarkę. Wygląda na to, że działa w FF10 i IE8 (czy ktoś może przetestować w innych wersjach)

$("#selectBox").get(0).selectedIndex = 1; 
Jean-Marc
źródło
1

Jeśli chcesz wybrać element na podstawie konkretnej właściwości elementu, opcja jQuery typu [prop = val] otrzyma ten element. Teraz nie dbam o indeks, po prostu chciałem element według jego wartości.

$('#mySelect options[value=3]).attr('selected', 'selected');
codeguy
źródło
1

Napotkałem ten sam problem. Najpierw musisz przejrzeć wydarzenia (tzn. Które wydarzenie nastąpi jako pierwsze).

Na przykład:

Pierwsze wydarzenie jest generowanie wybierz okno z opcjami.

Drugie wydarzenie jest wybranie opcji domyślnej, używając dowolnej funkcji, takich jak val () etc.

Powinieneś upewnić się, że Drugie wydarzenie powinno nastąpić po Pierwszym wydarzeniu .

Aby to osiągnąć, weźmy dwie funkcje, powiedzmy wygenerujSelectbox () (do genracji zaznaczenia) i selectDefaultOption ()

Musisz upewnić się, że selectDefaultOption () powinien być wywoływany dopiero po wykonaniu funkcji generateSelectbox ()

Mani
źródło
1

Możesz także zainicjować wiele wartości, jeśli pole wyboru jest wielokrotnością:

$('#selectBox').val(['A', 'B', 'C']);
Frank Glück
źródło
0

możesz ustawić wartość zmiennej selectoption dynamicznie, a opcja zostanie wybrana. Możesz spróbować wykonać następujący kod

kod:

 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>

      $(function(){
            $('#allcheck').click(function(){
             // $('#select_option').val([1,2,5]);also can use multi selectbox
              // $('#select_option').val(1);
               var selectoption=3;
           $("#selectBox>option[value="+selectoption+"]").attr('selected', 'selected');
    });

});

KOD HTML:

   <select id="selectBox">
       <option value="0">Number 0</option>
       <option value="1">Number 1</option>
       <option value="2">Number 2</option>
       <option value="3">Number 3</option>
       <option value="4">Number 4</option>
       <option value="5">Number 5</option>
       <option value="6">Number 6</option>
       <option value="7">Number 7</option>
 </select> <br>
<strong>Select&nbsp;&nbsp; <a style="cursor:pointer;" id="allcheck">click for select option</a></strong>

Ram Lakhan Yadav
źródło
-2

Wkrótce:

$("#selectBox").attr("selectedIndex",index)

gdzie indeks jest wybranym indeksem jako liczba całkowita.

Csaba
źródło
ten kod działa $ ('# selectBox'). prop ({selectedIndex: pożądanyIndeks})
jurijcz