Zmiana wybranej opcji elementu HTML Select

148

W moim kodzie HTML mam <select>trzy <option>elementy. Chcę użyć jQuery, aby sprawdzić wartość każdej opcji w JavaScript var. Jeśli pasuje, chcę ustawić wybrany atrybut tej opcji. Jak bym to zrobił?

llihttocs
źródło
Opublikuj swój kod HTML. Ale jak zwykle:$('#myselectid').val()
Samich,
9
Nie jestem pewien, dlaczego został odrzucony, jest nowym użytkownikiem i pytanie wydaje się uzasadnione.
vol7ron

Odpowiedzi:

323

Waniliowy JavaScript

Używanie zwykłego starego JavaScript:

var val = "Fish";
var sel = document.getElementById('sel');
document.getElementById('btn').onclick = function() {
  var opts = sel.options;
  for (var opt, j = 0; opt = opts[j]; j++) {
    if (opt.value == val) {
      sel.selectedIndex = j;
      break;
    }
  }
}
<select id="sel">
    <option>Cat</option>
    <option>Dog</option>
    <option>Fish</option>
</select>
<button id="btn">Select Fish</button>

jQuery

Ale jeśli naprawdę chcesz używać jQuery:

var val = 'Fish';
$('#btn').on('click', function() {
  $('#sel').val(val);
});

jQuery - Korzystanie z atrybutów wartości

W przypadku, gdy opcje mają atrybuty wartości, które różnią się od zawartości tekstowej i chcesz wybrać za pomocą treści tekstowej:

<select id="sel">
    <option value="1">Cat</option>
    <option value="2">Dog</option>
    <option value="3">Fish</option>
</select>
<script>
    var val = 'Fish';
    $('#sel option:contains(' + val + ')').prop({selected: true});
</script>

Próbny

Ale jeśli masz powyższe skonfigurowane i chcesz wybierać według wartości za pomocą jQuery, możesz zrobić tak jak poprzednio:

var val = 3;
$('#sel').val(val);

Nowoczesny DOM

W przypadku przeglądarek, które obsługują document.querySelectori tej HTMLOptionElement::selectedwłaściwości, jest to bardziej zwięzły sposób wykonania tego zadania:

var val = 3;    
document.querySelector('#sel [value="' + val + '"]').selected = true;

Próbny

Knockout.js

<select data-bind="value: val">
    <option value="1">Cat</option>
    <option value="2">Dog</option>
    <option value="3">Fish</option>
</select>
<script>
    var viewModel = {
        val: ko.observable()
    };
    ko.applyBindings(viewModel);
    viewModel.val(3);
</script>

Próbny

Polimer

<template id="template" is="dom-bind">
    <select value="{{ val }}">
        <option value="1">Cat</option>
        <option value="2">Dog</option>
        <option value="3">Fish</option>
    </select>
</template>
<script>
    template.val = 3;
</script>

Próbny

Kątowy 2

Uwaga: to nie zostało zaktualizowane w ostatecznej stabilnej wersji.

<app id="app">
    <select [value]="val">
        <option value="1">Cat</option>
        <option value="2">Dog</option>
        <option value="3">Fish</option>
    </select>
</app>
<script>
    var App = ng.Component({selector: 'app'})
        .View({template: app.innerHTML})
        .Class({constructor:  function() {}});

    ng.bootstrap(App).then(function(app) {
        app._hostComponent.instance.val = 3;
    });
</script>

Próbny

Vue 2

<div id="app">
    <select v-model="val">
        <option value="1">Cat</option>
        <option value="2">Dog</option>
        <option value="3">Fish</option>
    </select>
</div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
                val: null,
        },
        mounted: function() {
                this.val = 3;
        }
    });
</script>

Próbny

kzh
źródło
1
Było to szczególnie przydatne, ponieważ nie byłem pewien, jak ustawić wybrany atrybut. Nie zdawałem sobie sprawy, że istnieje wybrany indeks. Dzięki.
llihttocs,
1
@aelgoa jsperf.com/option-select-loop/2 Poprawiłem Twój pierwszy fragment kodu, aby bardziej naśladował mój kod, dzięki czemu mój działa wolniej. Użyłem post-inkrementacji zamiast preinkrementacji, a następnie dodałem kolejny test, który jest nieco szybszy niż twój trzeci test.
kzh
1
dla document.evaluate(".//select[@id='sel']/option[text()='Fish']", document.body, null, 9, null).singleNodeValue.selected = true;
sadystów
1
@llihttocs A co teraz?
kzh
1
Dziękujemy za dołączenie vanilla javascript - dla tych z nas, którzy uwielbiają kodować dla siebie :)
Peter Cullen
24

Żaden z przykładów używających jquery w tym miejscu nie jest w rzeczywistości poprawny, ponieważ pozostawi zaznaczenie wyświetlając pierwszy wpis, mimo że wartość została zmieniona.

Właściwy sposób, aby wybrać Alaskę i pokazać wybrany element, używając:

<select id="state">
    <option value="AL">Alabama</option>
    <option value="AK">Alaska</option>
    <option value="AZ">Arizona</option>
</select>

Z jquery byłoby:

$('#state').val('AK').change();
Justin Buser
źródło
19

Możesz zmienić wartość elementu select, który zmienia wybraną opcję na tę z tą wartością, używając JavaScript:

document.getElementById('sel').value = 'bike';​​​​​​​​​​

PRÓBNY

Ivin Raj
źródło
1
Twój przykład nie działa z powodu wyczucia czasu. Zaktualizowałem go, aby czekać, aż użytkownik kliknie przycisk: jsfiddle.net/xkqTR/3271
dlaliberte
nie powoduje to uruchomienia zdarzenia zmiany na wybranym elemencie. czy masz na to rozwiązanie?
DragonKnight,
10

Narzut

<select id="my_select">
    <option value="1">First</option>
    <option value="2">Second</option>
    <option value="3">Third</option>
</select>

jQuery

var my_value = 2;
$('#my_select option').each(function(){
    var $this = $(this); // cache this jQuery object to avoid overhead

    if ($this.val() == my_value) { // if this option's value is equal to our value
        $this.prop('selected', true); // select this option
        return false; // break the loop, no need to look further
    }
});

Próbny

Shef
źródło
Myślę, że właśnie tego potrzebowałem. Użyłem już kilku wierszy twojego kodu i wydaje się, że działa. Dzięki za świetne fragmenty.
llihttocs,
@llihttocs: Cieszę się, że pomogłem. Zapraszam do zaakceptowania odpowiedzi, która rozwiązuje problem, klikając pusty znacznik poniżej liczby głosów w lewym górnym rogu odpowiedzi. Aby to pytanie zostało oznaczone jako rozwiązane, a inni, którzy będą szukać tego samego rozwiązania, z łatwością znajdą odpowiedź.
Shef
4

Chcę zmienić wybraną opcję zaznaczonego elementu zarówno wartość, jak i textContent (co widzimy) na „Mango”.

Najprostszy kod, który działał, znajduje się poniżej:

var newValue1 = 'Mango'

var selectElement = document.getElementById('myselectid');
selectElement.options[selectElement.selectedIndex].value = newValue1;
selectElement.options[selectElement.selectedIndex].textContent = newValue1;

Mam nadzieję, że to komuś pomoże. Powodzenia.
Głosuj pozytywnie, jeśli ci to pomogło.

Manohar Reddy Poreddy
źródło
2

Przetestuj to demo

  1. Wybieranie opcji na podstawie jej wartości

    var vals = [2,'c'];
    
    $('option').each(function(){
       var $t = $(this);
    
       for (var n=vals.length; n--; )
          if ($t.val() == vals[n]){
             $t.prop('selected', true);
             return;
          }
    });
  2. Wybór opcji na podstawie jej tekstu

    var vals = ['Two','CCC'];                   // what we're looking for is different
    
    $('option').each(function(){
       var $t = $(this);
    
       for (var n=vals.length; n--; )
          if ($t.text() == vals[n]){            // method used is different
             $t.prop('selected', true);
             return;
          }
    });

Wspieranie HTML

<select>
   <option value=""></option>
   <option value="1">One</option>
   <option value="2">Two</option>
   <option value="3">Three</option>
</select>

<select>
   <option value=""></option>
   <option value="a">AAA</option>
   <option value="b">BBB</option>
   <option value="c">CCC</option>
</select>
vol7ron
źródło
1
Ten przykład jest bardzo przydatny. Nie byłem pewien, jak przejść przez opcje i ustawić wybrany atrybut. Dziękuję za tak pełną odpowiedź.
llihttocs,
Nie ma problemu, llihttocs, kliknij strzałkę w górę obok pytań / komentarzy, które uważasz za pomocne. I zaznacz znacznik wyboru obok wybranej odpowiedzi. - możesz zrobić albo bez tego, co cię kosztuje
vol7ron
1

Doskonałe odpowiedzi - oto wersja D3 dla każdego, kto szuka:

<select id="sel">
    <option>Cat</option>
    <option>Dog</option>
    <option>Fish</option>
</select>
<script>
    d3.select('#sel').property('value', 'Fish');
</script>
Tristan Reid
źródło
1

Skorzystałem z prawie wszystkich zamieszczonych tutaj odpowiedzi, ale nie czułem się z tym komfortowo, więc poszedłem o krok dalej i znalazłem łatwe rozwiązanie, które pasuje do moich potrzeb i czuję, że warto się z wami podzielić.
Zamiast iteracji po wszystkich opcjach lub za pomocą JQuery , możesz zrobić używając core JS w prostych krokach:

Przykład

<select id="org_list">
  <option value="23">IBM</option>
  <option value="33">DELL</option>
  <option value="25">SONY</option>
  <option value="29">HP</option>
</select>

Musisz więc znać wartość opcji do wyboru.

function selectOrganization(id){
    org_list=document.getElementById('org_list');
    org_list.selectedIndex=org_list.querySelector('option[value="'+id+'"]').index;
}

Jak używać?

selectOrganization(25); //this will select SONY from option List

Twoje komentarze są mile widziane. :) AzmatHunzai.

Azmat Karim Khan
źródło
1

Po wielu poszukiwaniach próbowałem @kzh na liście wyboru, gdzie znam tylko optiontekst wewnętrzny, a nie valueatrybut, ten kod oparty na wybranej odpowiedzi Użyłem go do zmiany opcji wyboru zgodnie z bieżącą stroną urlw tym formacie http://www.example.com/index.php?u=Steve

<select id="sel">
    <option>Joe</option>
    <option>Steve</option>
    <option>Jack</option>
</select>
<script>
    var val = window.location.href.split('u=')[1]; // to filter ?u= query 
    var sel = document.getElementById('sel');
    var opts = sel.options;
    for(var opt, j = 0; opt = opts[j]; j++) {
        // search are based on text inside option Attr
        if(opt.text == val) {
            sel.selectedIndex = j;
            break;
        }
    }
</script>

Dzięki temu urlparametry wyświetlane jako wybrane, będą bardziej przyjazne dla użytkownika, a odwiedzający będzie wiedział, jaką stronę lub profil aktualnie przegląda.

Salem
źródło
0

Użyłem tego po zaktualizowaniu rejestru i zmianie stanu żądania przez ajax, a następnie wykonuję zapytanie z nowym stanem w tym samym skrypcie i umieszczam go w elemencie select tag w nowym stanie, aby zaktualizować widok.

var objSel = document.getElementById("selectObj");
objSel.selectedIndex = elementSelected;

Mam nadzieję, że to się przyda.

user7071893
źródło
-1

Nieco schludniejsza wersja Vanilla.JS. Zakładając, że już naprawiłeś nodeListbrakujące .forEach():

NodeList.prototype.forEach = Array.prototype.forEach

Właśnie:

var requiredValue = 'i-50332a31',   
  selectBox = document.querySelector('select')

selectBox.childNodes.forEach(function(element, index){
  if ( element.value === requiredValue ) {
    selectBox.selectedIndex = index
  }
})
mikemaccana
źródło