541 votes

jQuery - définir la valeur sélectionnée d'un contrôle de sélection via sa description textuelle

J'ai un contrôle de sélection, et dans une variable javascript j'ai une chaîne de texte.

À l'aide de jQuery, je souhaite que l'élément sélectionné du contrôle de sélection soit l'élément contenant la description textuelle dont je dispose (par opposition à la valeur, que je n'ai pas).

Je sais que la définition de la valeur est assez triviale, par exemple.

$("#my-select").val(myVal);

Mais j'ai un peu de mal à le faire via la description du texte. Je suppose qu'il doit y avoir un moyen d'extraire la valeur de la description textuelle, mais mon cerveau est trop fatigué pour y parvenir.

1 votes

@DanAtkinson était sur le point de faire la même chose. sélectionner n'a absolument rien à voir avec cette question.

773voto

Crescent Fresh Points 54070

Sélection par description pour jQuery v1.6+

var text1 = 'Two';
$("select option").filter(function() {
  //may want to use $.trim in here
  return $(this).text() == text1;
}).prop('selected', true);

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<select>
  <option value="0">One</option>
  <option value="1">Two</option>
</select>

versions de jQuery inférieures à 1.6 et supérieures ou égales à 1.4

var text1 = 'Two';
$("select option").filter(function() {
  //may want to use $.trim in here
  return $(this).text() == text1;
}).attr('selected', true);

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>

<select>
  <option value="0">One</option>
  <option value="1">Two</option>
</select>

Notez que cette approche fonctionne dans les versions supérieures à 1.6 et inférieures à 1.9, mais qu'elle est obsolète depuis la version 1.6. Elle ne fonctionnera pas dans jQuery 1.9+.


Versions précédentes

val() devrait traiter les deux cas.

$('select').val('1'); // selects "Two"
$('select').val('Two'); // also selects "Two"

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>

<select>
  <option value="0">One</option>
  <option value="1">Two</option>
</select>

6 votes

J'ai l'impression que cela ne devrait pas fonctionner (il semble que cela pourrait être ambigu), mais cela devrait en fait fonctionner correctement pour moi. Je vous remercie.

0 votes

@HermanD : oui je suppose qu'une méthode nommée "val" ne devrait pas sélectionner une option basée sur autre chose que l'attribut "value".

70 votes

Notez que jQuery 1.4 a modifié ce comportement en sélectionnant par value si l'attribut a été spécifié, et ne sélectionne par le texte que si l'attribut a été spécifié. value est manquant. Ainsi, dans cet exemple $('select').val('Two') sélectionnera la deuxième option dans la version 1.3.x, mais ne fera rien dans la version 1.4.x.

144voto

spoulson Points 13391

Je ne l'ai pas testé, mais cela pourrait vous convenir.

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

92voto

CarolinaJay65 Points 7136

Essayez ceci... pour sélectionner l'option avec le texte myText

$("#my-Select option[text=" + myText +"]").prop("selected", true);

0 votes

La réponse de @spoulson a fonctionné pour moi...j'ai essayé de le faire sans le .each

2 votes

Dans de nombreux cas, cette approche ne fonctionne malheureusement pas. J'ai même dû me résoudre à utiliser des $("#my-Select option[text=" + myText +"]").get(0).selected = true; de temps en temps :(...

2 votes

Assurez-vous que vous supprimez d'abord l'attribut sélectionné avant de le réinitialiser, sinon cela semblera ne pas fonctionner (cela fonctionne pour moi dans la version 1.9).

21voto

Russ Cam Points 58168
$("#myselect option:contains('YourTextHere')").val();

renvoie la valeur de la première option contenant votre texte de description. Testé et fonctionne.

0 votes

Merci - Je pense que c'est la version que j'utiliserai, car j'ai également besoin d'une logique pour les cas où il n'y a pas de texte correspondant, et cela semble être le mécanisme le plus simple pour pouvoir le faire.

1 votes

N'oubliez pas qu'il n'obtiendra que la valeur de la première option correspondant au texte.

0 votes

En outre, vous pourriez enchaîner attr("selected", "selected") sur l'ensemble enveloppé au lieu de val() et cela fonctionnerait de la même manière que la réponse de CarolinaJay65.

15voto

Dave Points 209

Pour éviter toutes les complications liées à la version de jQuery, je recommande honnêtement d'utiliser l'une de ces fonctions javascript très simples...

function setSelectByValue(eID,val)
{ //Loop through sequentially//
  var ele=document.getElementById(eID);
  for(var ii=0; ii<ele.length; ii++)
    if(ele.options[ii].value==val) { //Found!
      ele.options[ii].selected=true;
      return true;
    }
  return false;
}

function setSelectByText(eID,text)
{ //Loop through sequentially//
  var ele=document.getElementById(eID);
  for(var ii=0; ii<ele.length; ii++)
    if(ele.options[ii].text==text) { //Found!
      ele.options[ii].selected=true;
      return true;
    }
  return false;
}

0 votes

Elle permet de sélectionner une option par le biais d'une valeur ou d'un texte (selon la fonction appelée). Par exemple : setSelectByValue('sausages','2') ; Trouvera et sélectionnera l'option avec la valeur "2" dans l'objet de sélection avec un id de "sausages".

2 votes

@Neal Euh... cela répond à la question ?

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