Ändern der ausgewählten Option eines HTML Select-Elements

148

In meinem HTML habe ich ein <select>mit drei <option>Elementen. Ich möchte jQuery verwenden, um den Wert jeder Option mit einem Javascript zu vergleichen var. Wenn eine übereinstimmt, möchte ich das ausgewählte Attribut dieser Option festlegen. Wie würde ich das machen?

llihttocs
quelle
Veröffentlichen Sie Ihren HTML-Code. Aber auf übliche Weise:$('#myselectid').val()
Samich
9
Ich bin mir nicht sicher, warum er herabgestuft wurde, er ist ein neuer Benutzer und die Frage scheint legitim zu sein.
Vol7ron

Antworten:

323

Vanille JavaScript

Verwenden von einfachem altem 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

Aber wenn Sie jQuery wirklich verwenden möchten:

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

jQuery - Verwenden von Wertattributen

Falls Ihre Optionen Wertattribute haben, die sich von ihrem Textinhalt unterscheiden und Sie über Textinhalt auswählen möchten:

<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>

Demo

Wenn Sie jedoch die oben genannten Einstellungen vorgenommen haben und mit jQuery nach Wert auswählen möchten, können Sie wie folgt vorgehen:

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

Modernes DOM

Für die unterstützten Browser document.querySelectorund die HTMLOptionElement::selectedEigenschaft ist dies eine prägnantere Methode, um diese Aufgabe auszuführen:

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

Demo

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>

Demo

Polymer

<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>

Demo

Winkel 2

Hinweis: Dies wurde für die endgültige stabile Version nicht aktualisiert.

<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>

Demo

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>

Demo

kzh
quelle
1
Dies war besonders nützlich, da ich nicht sicher war, wie ich das ausgewählte Attribut festlegen sollte. Ich wusste nicht, dass es einen ausgewählten Index gibt. Vielen Dank.
llihttocs
1
@aelgoa jsperf.com/option-select-loop/2 Ich habe Ihr erstes Snippet korrigiert, um meinen Code besser nachzuahmen, was meinen langsamer macht. Ich habe Post-Inkrement anstelle von Pre-Inkrement verwendet und dann einen weiteren Test hinzugefügt, der etwas schneller ist als Ihr dritter Test.
kzh
1
für die sadistischen:document.evaluate(".//select[@id='sel']/option[text()='Fish']", document.body, null, 9, null).singleNodeValue.selected = true;
kzh
1
@llihttocs Was ist jetzt?
kzh
1
Vielen Dank für die Aufnahme von Vanille-Javascript - für diejenigen von uns, die es lieben, für uns selbst zu programmieren :)
Peter Cullen
24

Keines der hier verwendeten Beispiele für jquery ist tatsächlich korrekt, da die Auswahl den ersten Eintrag anzeigt, obwohl der Wert geändert wurde.

Der richtige Weg, um Alaska auszuwählen und die Auswahl das richtige Element anzeigen zu lassen, wie ausgewählt mit:

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

Mit jquery wäre:

$('#state').val('AK').change();
Justin Buser
quelle
19

Sie können den Wert des Auswahlelements ändern, wodurch die ausgewählte Option mithilfe von JavaScript in die Option mit diesem Wert geändert wird:

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

DEMO

Ivin Raj
quelle
1
Ihr Beispiel funktioniert aufgrund des Timings nicht ganz. Ich habe es aktualisiert, um zu warten, bis der Benutzer auf eine Schaltfläche klickt: jsfiddle.net/xkqTR/3271
dlaliberte
Dies löst kein Änderungsereignis für das ausgewählte Element aus. Hast du eine Lösung dafür?
DragonKnight
10

Markup

<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
    }
});

Demo

Shef
quelle
Ich denke, das ist genau das, was ich brauchte. Ich habe bereits mehrere Zeilen Ihres Codes verwendet und es scheint zu funktionieren. Danke für die tollen Schnipsel.
llihttocs
@llihttocs: Ich bin froh, dass ich geholfen habe. Sie können die Antwort, die Ihr Problem löst, auch akzeptieren, indem Sie auf das leere Häkchen unter der Stimmenzahl oben links in der Antwort klicken. Damit diese Frage als gelöst markiert wird und andere, die nach der gleichen Lösung suchen, die Antwort leicht finden.
Shef
4

Ich möchte den Wert und den Textinhalt der ausgewählten Option des ausgewählten Elements (was wir sehen) in 'Mango' ändern.

Der einfachste Code, der funktioniert hat, ist unten:

var newValue1 = 'Mango'

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

Hoffe das hilft jemandem. Viel Glück.
Stimmen Sie ab, wenn dies Ihnen geholfen hat.

Manohar Reddy Poreddy
quelle
2

Testen Sie diese Demo

  1. Auswahl der Option basierend auf ihrem Wert

    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. Auswahl der Option basierend auf dem Text

    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;
          }
    });

HTML unterstützen

<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
quelle
1
Dieses Beispiel ist sehr nützlich. Ich war mir nicht sicher, wie ich die Optionen durchlaufen und das ausgewählte Attribut festlegen sollte. Vielen Dank für eine so vollständige Antwort.
llihttocs
Kein Problem, klicken Sie auf den Aufwärtspfeil neben den Fragen / Kommentaren, die Sie hilfreich finden. Aktivieren Sie das Häkchen neben der von Ihnen ausgewählten Antwort. - Sie können entweder tun, ohne dass es Sie etwas kostet
Vol7ron
1

Hervorragende Antworten - hier ist die D3-Version für alle, die suchen:

<select id="sel">
    <option>Cat</option>
    <option>Dog</option>
    <option>Fish</option>
</select>
<script>
    d3.select('#sel').property('value', 'Fish');
</script>
Tristan Reid
quelle
1

Ich habe fast alle hier veröffentlichten Antworten verwendet, bin aber damit nicht zufrieden. Deshalb habe ich einen Schritt weiter gegraben und eine einfache Lösung gefunden, die meinen Bedürfnissen entspricht und es wert ist, mit euch geteilt zu werden.
Anstatt alle Optionen zu iterieren oder JQuery zu verwenden , können Sie Core JS in einfachen Schritten verwenden:

Beispiel

<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>

Sie müssen also den Wert der auswählenden Option kennen.

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

Wie benutzt man?

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

Ihre Kommentare sind willkommen. :) AzmatHunzai.

Azmat Karim Khan
quelle
1

Nach langem Suchen habe ich @kzh in einer Auswahlliste ausprobiert, in der ich nur den optioninneren Text und nicht das valueAttribut kenne. Dieser Code basiert auf der Auswahlantwort. Ich habe ihn verwendet, um die Auswahloption entsprechend der aktuellen Seite urlin diesem Format zu ändernhttp://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>

Dadurch werden die urlParameter als ausgewählt angezeigt, um sie benutzerfreundlicher zu gestalten, und der Besucher weiß, welche Seite oder welches Profil er gerade anzeigt.

Salem
quelle
0

Ich habe dies verwendet, nachdem ich ein Register aktualisiert und den Status der Anforderung über Ajax geändert habe. Dann führe ich eine Abfrage mit dem neuen Status im selben Skript durch und setze ihn in den neuen Status des Select-Tag-Elements, um die Ansicht zu aktualisieren.

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

Ich hoffe das ist nützlich.

user7071893
quelle
-1

Etwas ordentlicher Vanilla.JS Version. Angenommen, Sie haben das nodeListFehlen bereits behoben .forEach():

NodeList.prototype.forEach = Array.prototype.forEach

Gerade:

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

selectBox.childNodes.forEach(function(element, index){
  if ( element.value === requiredValue ) {
    selectBox.selectedIndex = index
  }
})
Mikemaccana
quelle