Comment sélectionnez-vous une option particulière dans un élément SELECT dans jQuery?


718

Si vous connaissez l'index, la valeur ou le texte. également si vous n'avez pas d'ID pour une référence directe.

Ceci , ceci et ceci sont toutes des réponses utiles.

Exemple de balisage

<div class="selDiv">
  <select class="opts">
    <option selected value="DEFAULT">Default</option>
    <option value="SEL1">Selection 1</option>
    <option value="SEL2">Selection 2</option>
  </select>
</div>

46
$("#my_select").val("the_new_value").change();... ... de so
dsdsdsdsd

Réponses:


1206

Un sélecteur pour obtenir l'élément d'option du milieu par valeur est

$('.selDiv option[value="SEL1"]')

Pour un index:

$('.selDiv option:eq(1)')

Pour un texte connu:

$('.selDiv option:contains("Selection 1")')

EDIT : Comme indiqué ci-dessus, le PO pourrait avoir été après avoir modifié l'élément sélectionné dans la liste déroulante. Dans les versions 1.6 et supérieures, la méthode prop () est recommandée:

$('.selDiv option:eq(1)').prop('selected', true)

Dans les anciennes versions:

$('.selDiv option:eq(1)').attr('selected', 'selected')

EDIT2 : après le commentaire de Ryan. Une correspondance sur "Sélection 10" peut être indésirable. Je n'ai trouvé aucun sélecteur pour faire correspondre le texte intégral, mais un filtre fonctionne:

 $('.selDiv option')
    .filter(function(i, e) { return $(e).text() == "Selection 1"})

EDIT3 : Soyez prudent avec $(e).text()car il peut contenir une nouvelle ligne faisant échouer la comparaison. Cela se produit lorsque les options sont implicitement fermées (pas de </option>balise):

<select ...>
<option value="1">Selection 1
<option value="2">Selection 2
   :
</select>

Si vous utilisez simplement e.textdes espaces supplémentaires, comme la nouvelle ligne de fin sera supprimée, ce qui rend la comparaison plus robuste.


8
: contient n'est pas génial car il correspondra à des morceaux de texte; problématique si l'un de vos textes d'options est une sous-chaîne d'un autre texte d'options.
Ryan

26
Cela fonctionne aussi $ ('# id option [value = "0"]'). Attr ('selected', 'selected');
DevC

@Grastveit comment changer la couleur de la première option si elle est sélectionnée ou non quand elle a une classe disons myClass. Merci
Zaker

@Utilisateur, je ne comprends pas. Peut-être l'afficher dans une nouvelle question? Ou est-ce $ ('. SelDiv .myClass'). Css ('color', 'red')?
Grastveit

6
Je voudrais ajouter que vous devez définitivement utiliser prop et non attr. Je suis presque devenu fou en essayant de déboguer une application et en passant de attr à prop corrigé.
user609926

125

Aucune des méthodes ci-dessus n'a fourni la solution dont j'avais besoin, alors j'ai pensé que je fournirais ce qui fonctionnait pour moi.

$('#element option[value="no"]').attr("selected", "selected");

10
Notez que depuis jQuery 1.6, cela devrait être utilisé propet non attr.
Fin du codage du

@GoneCoding Using .attrest correct. "sélectionné" est un attribut de <option> w3.org/TR/html5/forms.html#attr-option-selected
Carlos Llongo

3
@CarlosLlongo: Ce n'est pas pertinent. La recommandation jQuery est de toujours utiliser propde préférence à attr. Cela évite d'avoir à rechercher chaque propriété sur w3.org afin de voir s'il ne s'agit que d'un attribut ou s'il est implémenté avec des actions de sauvegarde.
Fin du codage

82

Vous pouvez simplement utiliser la val()méthode:

$('select').val('the_value');

20
C'est faux car vous définissez la valeur de TOUS les éléments SELECT sur the_value. .val n'est pas une fonction sélecteur / filtre! C'est un accesseur de propriété et en lui passant cette chaîne, SETS la valeur. J'ai essayé de reprendre mon vote positif, mais il était trop tard après l'avoir réalisé lors des tests.
AaronLS

4
Avez-vous 10 votes comme réponse utile? Le val () est un getter et un setter. Si vous utilisez simplement val (), vous obtiendrez la valeur. Si vous passez quelque chose comme val ('the_value'), vous le définissez sur 'the_value'
Gui

12
Veuillez @AaronLS et @guilhermeGeek, reportez-vous aux documents (dernier exemple). Il fonctionne comme un sélecteur pour la sélection, des cases à cocher et des boutons radio, et comme un régleur de valeurs pour les entrées de texte et les zones de texte.
Leandro Ardissone

9
Vous avez mal lu la documentation. Pour les cases à cocher, les radios et les listes, la commande définit l'attribut "sélectionné" pour ces éléments. Le dernier exemple montre comment le passage de val ("case à cocher 1") le fait devenir sélectionné. Ce n'est pas la même chose qu'un "sélecteur" en termes d'obtention des objets via le sélecteur CSS / jquery. J'ai testé votre code, cela ne fonctionne pas.
AaronLS

27
+1: non, ce n'est pas un sélecteur JQuery, mais je pense que la plupart des gens qui recherchent cette question sont comme moi, et veulent simplement changer l'option actuellement sélectionnée; proposer un véritable sélecteur n'est qu'un moyen de le faire. Et c'est certainement mieux que les réponses que j'ai vues qui vous ont fait répéter toutes les options.
kdgregory

57

Par valeur, ce qui a fonctionné pour moi avec jQuery 1.7 était le code ci-dessous, essayez ceci:

$('#id option[value=theOptionValue]').prop('selected', 'selected').change();

5
Je ne suis pas sûr que vous ayez besoin de la méthode .change ().
Phillip Senn du

6
Le .change()était nécessaire. J'ai eu un exemple où je changeais de vignette sur la base d'un SELECT. Lorsque j'ai téléchargé un thème personnalisé, il était censé sélectionner "Thème personnalisé" dans la liste des options. L' .prop()appel a fonctionné, mais sans .change(), l'image miniature à droite de ma sélection n'a jamais été mise à jour.
Volomike

2
.change () était le meilleur conseil. +1
Ja8zyjits

1
Remarque: une propvaleur booléenne génère la même sortie. par exemple.prop('selected', true)
Gone Coding

Cela dépend, certains navigateurs - peut-être d'anciens navigateurs - ont besoin de la chaîne «sélectionnée». Je pense que la majorité d'entre eux soutiennent la chaîne de texte.
mpoletto

16

Il existe un certain nombre de façons de le faire, mais l'approche la plus propre a été perdue parmi les meilleures réponses et des tas d'arguments val(). Certaines méthodes ont également changé à partir de jQuery 1.6, donc cela nécessite une mise à jour.

Pour les exemples suivants, je suppose que la variable $selectest un objet jQuery pointant sur la <select>balise souhaitée , par exemple via ce qui suit:

var $select = $('.selDiv .opts');

Remarque 1 - utilisez val () pour les correspondances de valeurs:

Pour la correspondance des valeurs, l'utilisation val()est beaucoup plus simple que l'utilisation d'un sélecteur d'attribut: https://jsfiddle.net/yz7tu49b/6/

$select.val("SEL2");

La version setter de .val()est implémentée sur les selectbalises en définissant la selectedpropriété d'une correspondance optionavec la même chose value, elle fonctionne donc très bien sur tous les navigateurs modernes.

Remarque 2 - utilisez prop («sélectionné», vrai):

Si vous souhaitez définir directement l'état sélectionné d'une option, vous pouvez utiliser prop(pas attr) avec un booleanparamètre (plutôt que la valeur de texte selected):

par exemple https://jsfiddle.net/yz7tu49b/

$option.prop('selected', true);  // Will add selected="selected" to the tag

Remarque 3 - autorisez les valeurs inconnues:

Si vous utilisez val()pour sélectionner un <option>, mais que la val ne correspond pas (cela peut se produire en fonction de la source des valeurs), alors "rien" est sélectionné et $select.val()revient null.

Donc, pour l'exemple montré, et pour des raisons de robustesse, vous pouvez utiliser quelque chose comme ceci https://jsfiddle.net/1250Ldqn/ :

var $select = $('.selDiv .opts');
$select.val("SEL2");
if ($select.val() == null) {
  $select.val("DEFAULT");
}

Note 4 - correspondance exacte du texte:

Si vous souhaitez faire correspondre le texte exact, vous pouvez utiliser une filterfonction avec. par exemple https://jsfiddle.net/yz7tu49b/2/ :

var $select = $('.selDiv .opts');
$select.children().filter(function(){
    return this.text == "Selection 2";
}).prop('selected', true);

bien que si vous avez des espaces supplémentaires, vous souhaiterez peut-être ajouter une garniture au chèque comme dans

    return $.trim(this.text) == "some value to match";

Note 5 - correspondance par index

Si vous voulez faire correspondre par index, il suffit d'indexer les enfants de la sélection, par exemple https://jsfiddle.net/yz7tu49b/3/

var $select = $('.selDiv .opts');
var index = 2;
$select.children()[index].selected = true;

Bien que j'ai tendance à éviter les propriétés DOM directes en faveur de jQuery de nos jours, au code à l'épreuve du temps, de sorte que cela pourrait également être fait comme https://jsfiddle.net/yz7tu49b/5/ :

var $select = $('.selDiv .opts');
var index = 2;
$select.children().eq(index).prop('selected', true);

Remarque 6 - utilisez change () pour déclencher la nouvelle sélection

Dans tous les cas ci-dessus, l'événement de modification ne se déclenche pas. Ceci est voulu par la conception afin que vous ne vous retrouviez pas avec des événements de changement récursifs.

Pour générer l'événement change, si nécessaire, ajoutez simplement un appel .change()à l' selectobjet jQuery . Par exemple, le tout premier exemple le plus simple devient https://jsfiddle.net/yz7tu49b/7/

var $select = $('.selDiv .opts');
$select.val("SEL2").change();

Il existe également de nombreuses autres façons de trouver les éléments à l'aide de sélecteurs d'attributs [value="SEL2"], mais vous devez vous rappeler que les sélecteurs d'attributs sont relativement lents par rapport à toutes ces autres options.


13

Vous pouvez nommer le sélectionner et l'utiliser:

$("select[name='theNameYouChose']").find("option[value='theValueYouWantSelected']").attr("selected",true);

Il doit sélectionner l'option souhaitée.


12
   $(elem).find('option[value="' + value + '"]').attr("selected", "selected");

Merci pour votre message, mais qu'est-ce que cette réponse ajoute à la conversation qui n'est pas incluse dans les réponses acceptées?
Edward

si une option est déjà sélectionnée, cela échouera car une liste déroulante ne peut pas avoir plus d'un élément sélectionné, sauf s'il s'agit d'une sélection multiple. Vous devez faire .prop ('sélectionné', vrai)
derekcohen

9

Répondre à ma propre question pour la documentation. Je suis sûr qu'il existe d'autres façons d'y parvenir, mais cela fonctionne et ce code est testé.

<html>
<head>
<script language="Javascript" src="javascript/jquery-1.2.6.min.js"></script>
<script type="text/JavaScript">

$(function() {
    $(".update").bind("click",      // bind the click event to a div
        function() {
            var selectOption = $('.selDiv').children('.opts') ;
            var _this = $(this).next().children(".opts") ;

            $(selectOption).find("option[index='0']").attr("selected","selected");
//          $(selectOption).find("option[value='DEFAULT']").attr("selected","selected");
//          $(selectOption).find("option[text='Default']").attr("selected","selected");


//          $(_this).find("option[value='DEFAULT']").attr("selected","selected");
//          $(_this).find("option[text='Default']").attr("selected","selected");
//          $(_this).find("option[index='0']").attr("selected","selected");

    }); // END Bind
}); // End eventlistener

</script>
</head>
<body>
<div class="update" style="height:50px; color:blue; cursor:pointer;">Update</div>
<div class="selDiv">
        <select class="opts">
            <option selected value="DEFAULT">Default</option>
            <option value="SEL1">Selection 1</option>
            <option value="SEL2">Selection 2</option>
        </select>
    </div>
</body>
</html>

9

Exactement, cela fonctionnera essayez les méthodes ci-dessous

Pour l'option de sélection normale

<script>    
    $(document).ready(function() {
    $("#id").val('select value here');
       });
        </script>

Pour sélectionner 2 options, l'option de déclenchement doit être utilisée

<script>    
        $(document).ready(function() {
        $("#id").val('select value here').trigger('change');
           });
            </script>


8

Pour définir la valeur de sélection avec le déclenchement sélectionné:

$('select.opts').val('SEL1').change();

Pour définir l'option à partir d'une étendue:

$('.selDiv option[value="SEL1"]')
    .attr('selected', 'selected')
    .change();

Ce code utilise le sélecteur pour trouver l'objet sélectionné avec condition, puis modifiez l'attribut sélectionné par attr().


De plus, je recommande d'ajouter un change()événement après avoir défini l'attribut sur selected, ce faisant, le code se fermera à la sélection par l'utilisateur.


6

J'utilise ceci, quand je connais l'index de la liste.

$("#yourlist :nth(1)").prop("selected","selected").change();

Cela permet à la liste de changer et de déclencher l'événement de changement. Le ": nth (n)" compte à partir de l'index 0


5

j'irai avec: -

$("select#my-select option") .each(function() { this.selected = (this.text == myVal); });

5

Essaye ça

vous utilisez simplement select field id au lieu de #id (c'est-à-dire # select_name)

au lieu de la valeur de l' option d' utiliser votre sélectionnez l' option valeur

 <script>
    $(document).ready(function() {
$("#id option[value='option value']").attr('selected',true);
   });
    </script>

3

Pour Jquery choisi si vous envoyez l'attribut à la fonction et devez mettre à jour-sélectionner l'option

$('#yourElement option[value="'+yourValue+'"]').attr('selected', 'selected');
$('#editLocationCity').chosen().change();
$('#editLocationCity').trigger('liszt:updated');

3
/* This will reset your select box with "-- Please Select --"   */ 
    <script>
    $(document).ready(function() {
        $("#gate option[value='']").prop('selected', true);
    });
    </script>

1

Le $('select').val('the_value');semble la bonne solution et si vous avez des lignes de table de données, alors:

$row.find('#component').val('All');

1

si vous ne souhaitez pas utiliser jQuery, vous pouvez utiliser le code ci-dessous:

document.getElementById("mySelect").selectedIndex = "2";

1

Merci pour la question. J'espère que ce morceau de code fonctionnera pour vous.

var val = $("select.opts:visible option:selected ").val();

0
$('#select option[data-id-estado="3"]').prop("selected",true).trigger("change");

ou

$('#select option[value="myValue"]').prop("selected",true).trigger("change");

Veuillez modifier votre réponse pour que le code soit formaté en tant que code. Pour ce faire, utilisez la barre d'outils ou indenter simplement toutes les lignes de chaque bloc de code de quatre espaces.
beruic
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.