174 votes

Modification de l'option sélectionnée d'un élément HTML Select

Dans mon HTML, j'ai un <select> avec trois <option> éléments. Je veux utiliser jQuery pour vérifier la valeur de chaque option en fonction d'un code Javascript. var . Si l'une d'entre elles correspond, je veux définir l'attribut sélectionné de cette option. Comment dois-je m'y prendre ?

0 votes

Postez votre HTML. Mais de la manière habituelle : $('#myselectid').val()

12 votes

Je ne sais pas pourquoi il a été rétrogradé, c'est un nouvel utilisateur et la question semble légitime.

377voto

kzh Points 5098

Vanilla JavaScript

En utilisant le bon vieux 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

Mais si vous realmente voulez utiliser jQuery :

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

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

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<select id="sel">
    <option>Cat</option>
    <option>Dog</option>
    <option>Fish</option>
</select>
<button id="btn">Select Fish</button>

jQuery - Utilisation des attributs de valeur

Dans le cas où vos options ont des attributs de valeur qui diffèrent de leur contenu textuel et que vous voulez sélectionner via le contenu textuel :

<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

Mais si vous avez la configuration ci-dessus et que vous voulez sélectionner par valeur en utilisant jQuery, vous pouvez faire comme avant :

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

DOM moderne

Pour les navigateurs qui prennent en charge document.querySelector y el HTMLOptionElement::selected propriété, c'est une façon plus succincte d'accomplir cette tâche :

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

Polymère

<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

Angulaire 2

Note : ceci n'a pas été mis à jour pour la version stable finale.

<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

1 votes

C'était particulièrement utile car je ne savais pas comment définir l'attribut sélectionné. Je n'avais pas réalisé qu'il existait un selectedIndex. Merci.

0 votes

@llihttocs :-( Et maintenant ?

1 votes

@aelgoa jsperf.com/option-select-loop/2 J'ai corrigé votre premier extrait pour qu'il ressemble plus à mon code, ce qui rend le mien plus lent. J'ai utilisé la post-incrémentation au lieu de la pré-incrémentation, puis j'ai ajouté un autre test qui est légèrement plus rapide que votre 3ème test.

27voto

Justin Buser Points 1567

Aucun des exemples utilisant jquery ici n'est correct car ils laissent la sélection afficher la première entrée même si la valeur a été modifiée.

La bonne façon de sélectionner l'Alaska et de faire en sorte que la sélection montre le bon élément comme sélectionné en utilisant :

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

Avec jquery, ce serait :

$('#state').val('AK').change();

10voto

Shef Points 21595

Balisage

<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

0 votes

Je pense que c'est exactement ce dont j'avais besoin. J'ai déjà utilisé plusieurs lignes de votre code et cela semble fonctionner. Merci pour ces superbes extraits.

0 votes

@llihttocs : Content d'avoir aidé. N'hésitez pas à accepter la réponse qui résout votre problème en cliquant sur la coche vide sous le nombre de votes en haut à gauche de la réponse. Ainsi, cette question sera marquée comme résolue et les autres personnes qui chercheront la même solution trouveront la réponse facilement.

2voto

vol7ron Points 11270

Testez cette démo

  1. Sélection de l'option en fonction de son valeur

    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. Sélection de l'option en fonction de son texte

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

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

1 votes

Cet exemple est très utile. Je ne savais pas comment faire pour itérer parmi les options et définir l'attribut sélectionné. Merci pour cette réponse si complète.

0 votes

Pas de problème llihttocs, n'oubliez pas de cliquer sur la flèche vers le haut à côté des questions/commentaires que vous trouvez utiles. Et cochez la case à côté de la réponse que vous choisissez. -- Vous pouvez faire l'un ou l'autre sans que cela ne vous coûte rien.

-1voto

mikemaccana Points 7470

Version légèrement plus soignée de Vanilla.JS. En supposant que vous avez déjà corrigé nodeList manquant .forEach() :

NodeList.prototype.forEach = Array.prototype.forEach

Juste :

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X