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

530

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

En utilisant jQuery, je veux définir l'élément sélectionné du contrôle de sélection comme étant l'élément avec la description textuelle que j'ai (par opposition à la valeur, que je n'ai pas).

Je sais que le définir par valeur est assez trivial. par exemple

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

Mais je suis un peu perplexe sur le faire via la description textuelle. Je suppose qu'il doit y avoir un moyen de tirer la valeur de la description textuelle, mais mon cerveau est trop vendredi après-midi pour pouvoir le déterminer.

DanSingerman
la source
1
@DanAtkinson était sur le point de faire de même moi-même. select n'a absolument rien à voir avec cette question.
thecoshman

Réponses:

757

Sélectionner 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 bien que cette approche fonctionne dans les versions supérieures à 1,6 mais inférieures à 1,9, elle est déconseillée depuis 1.6. Cela ne fonctionnera pas dans jQuery 1.9+.


Versions précédentes

val() devrait gérer 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>

Croissant frais
la source
6
Cela semble que cela ne devrait pas fonctionner (il semble que cela puisse être ambigu), mais cela devrait en fait bien fonctionner pour moi. Merci.
DanSingerman
69
Notez que jQuery 1.4 a maintenant modifié ce comportement pour sélectionner par valuesi l'attribut a été spécifié, et sélectionner uniquement par texte si l' valueattribut est manquant. Donc, dans cet exemple $('select').val('Two'), sélectionnera la deuxième option dans 1.3.x, mais ne fera rien dans 1.4.x.
Crescent Fresh
18
Alors, quelle est la meilleure façon de le faire en 1.4 maintenant?
JR Lawhorne
4
Dans les versions plus récentes de jQuery, .val ('not-an-option-value') réinitialisera la sélection à la première option.
dland
5
La première réponse à cette question semble être la solution post 1.3.x stackoverflow.com/questions/3644449/…
DA.
142

Je n'ai pas testé cela, mais cela pourrait fonctionner pour vous.

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

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

$("#my-Select option[text=" + myText +"]").prop("selected", true);
Jay Corbett
la source
La réponse de @ spoulson a fonctionné pour moi ... J'ai essayé de le faire sans le .each
Jay Corbett
2
Dans de nombreux cas, cette approche ne fonctionne malheureusement pas. Je devais même $("#my-Select option[text=" + myText +"]").get(0).selected = true;de temps en temps me résoudre au style classique : (...
Shahriyar Imanov
2
Assurez-vous que vous supprimez d'abord l'attribut sélectionné avant de le réinitialiser, sinon il semblera ne pas fonctionner (fonctionne pour moi en 1.9)
esse
3
@MarkW Pour 1.9, utilisez .propau lieu de .attr; la cause du changement est que dans 1.9 jQuery a désactivé les anciens hacks qui vous .attrpermettaient de modifier certaines propriétés DOM ainsi que les attributs HTML. (Google javascript dom properties vs attributessi vous ne connaissez pas la distinction.)
Mark Amery
Réponse mise à jour à utiliser .prop('selected', true)au lieu de .attr('selected', 'selected')pour la compatibilité jQuery 1.9+.
erwaman
43

Je le fais de cette façon (jQuery 1.9.1)

$("#my-select").val("Dutch").change();

Remarque: n'oubliez pas le changement (), j'ai dû chercher trop longtemps à cause de cela :)

ErazerBrecht
la source
2
J'aimerais pouvoir voter plusieurs fois. C'est une heure après avoir arrêté et maintenant je peux rentrer chez moi.
Bob Jordan
Très bonne réponse! court et simple ... Cela devrait être au top ... Continuez à voter.
Muhammad Tarique
Cela a fonctionné dans mon cas, merci! Mais cela n'est-il pas sélectionné non pas par le texte affiché, comme l'OP l'a demandé, mais par la valeur elle-même, que l'OP n'a pas?
Brandon Rhodes
21
$("#myselect option:contains('YourTextHere')").val();

renverra la valeur de la première option contenant votre description textuelle. Testé cela et fonctionne.

Russ Cam
la source
Merci - je pense que cela pourrait être la version que j'utilise, car j'ai également besoin d'avoir une logique pour quand il n'y a pas de texte correspondant, et cela semble être le mécanisme le plus simple, pour pouvoir le faire.
DanSingerman
1
gardez à l'esprit, il n'obtiendra que la valeur de la première option correspondant au texte.
Russ Cam
De plus, vous pouvez enchaîner attr ("sélectionné", "sélectionné") sur l'ensemble enveloppé au lieu de val () et cela fonctionnerait de manière similaire à la réponse de CarolinaJay65
Russ Cam
1
OP dit " réglage valeur" ne pas " obtenir la valeur"
RousseauAlexandre
15

Pour éviter toutes les complications de la version jQuery, je recommande honnêtement d'utiliser l'une de ces fonctions javascript vraiment 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;
}
Dave
la source
Il permet de sélectionner une option de sélection via une valeur ou un texte (selon la fonction appelée). Par exemple: setSelectByValue ('saucisses', '2'); Trouvera et sélectionnera l'option avec la valeur "2" dans l'objet de sélection avec un id de "saucisses".
Dave
2
@Neal Uh ... ça répond à la question?
Mark Amery
10

Je sais que c'est un ancien article, mais je n'ai pas pu le sélectionner par texte en utilisant jQuery 1.10.3 et les solutions ci-dessus. J'ai fini par utiliser le code suivant (variation de la solution de spoulson):

      var textToSelect = "Hello World";

      $("#myDropDown option").each(function (a, b) {
            if ($(this).html() == textToSelect ) $(this).attr("selected", "selected");
        });

J'espère que cela aide quelqu'un.

Losbear
la source
10

Cette ligne a fonctionné:

$("#myDropDown option:contains(myText)").attr('selected', true);
Diego Unanue
la source
7
 $("#Test").find("option:contains('two')").each(function(){
     if( $(this).text() == 'two' ) {
        $(this).attr("selected","selected");
     }
 });

L'instruction if fait une correspondance exacte avec "deux" et "deux trois" ne sera pas mise en correspondance

aWebDeveloper
la source
Non, ce n'est pas ce que je voulais dire. Je pense que mon commentaire n'était pas clair, alors je l'ai juste supprimé. J'ai toutefois voté positivement, car cela a fonctionné pour ma situation.
Jagd
6

Le moyen le plus simple avec 1.7+ est:

$("#myDropDown option:text=" + myText +"").attr("selected", "selected"); 

1.9+

$("#myDropDown option:text=" + myText +"").prop("selected", "selected"); 

Testé et fonctionne.

RParker
la source
1
Pas en 1.9+, ce n'est pas le cas. Depuis 1.6, vous devriez utiliser .proppour changer les propriétés DOM, pas .attr(ce qui est pour les attributs HTML / DOM). Voir stackoverflow.com/q/5874652/1709587
Mark Amery
J'utiliserais ("sélectionné", vrai) au lieu de la valeur véridique de "sélectionné"
mplungjan
5

Voici un moyen très simple. plz l'utiliser

$("#free").val("y").change();
Pankaj Chauhan
la source
4

jetez un oeil au plugin jquery selectedbox

selectOptions(value[, clear]): 

Sélectionnez les options par valeur, en utilisant une chaîne comme paramètre $("#myselect2").selectOptions("Value 1");ou une expression régulière $("#myselect2").selectOptions(/^val/i);.

Vous pouvez également effacer les options déjà sélectionnées: $("#myselect2").selectOptions("Value 2", true);

Vitor Silva
la source
3

Juste sur une note secondaire. Ma valeur sélectionnée n'était pas définie. Et j'ai cherché partout sur le net. En fait, j'ai dû sélectionner une valeur après un rappel d'un service Web, car j'en obtenais des données.

$("#SelectMonth option[value=" + DataFromWebService + "]").attr('selected', 'selected'); 
$("#SelectMonth").selectmenu('refresh', true);

Le rafraîchissement du sélecteur était donc la seule chose qui me manquait.

Ammar Bukhari
la source
C'est la bonne - bien ... je ne vois aucune raison pour la deuxième ligne. Devrait fonctionner tel quel.
Sagive SEO
2

J'ai trouvé qu'en utilisant attrvous vous retrouveriez avec plusieurs options sélectionnées lorsque vous ne vouliez pas - la solution est d'utiliser prop:

$("#myDropDown option:text=" + myText +"").prop("selected", "selected");

Chris Edwards
la source
1

J'ai eu un problème avec les exemples ci-dessus, et le problème était dû au fait que mes valeurs de zone de sélection sont préremplies avec des chaînes de longueur fixe de 6 caractères, mais le paramètre transmis n'est pas de longueur fixe.

J'ai une fonction rpad qui remplira à droite une chaîne, à la longueur spécifiée et avec le caractère spécifié. Ainsi, après remplissage du paramètre, cela fonctionne.

$('#wsWorkCenter').val(rpad(wsWorkCenter, 6, ' '));


function rpad(pStr, pLen, pPadStr) {
if (pPadStr == '') {pPadStr == ' '};
while (pStr.length < pLen)
    pStr = pStr + pPadStr;
return pStr; 
} 
Keith
la source
1
 $('#theYear').on('change', function () {
 FY = $(this).find('option:selected').text();
 $('#theFolders').each(function () {
     $('option:not(:contains(' + FY + '))', this).hide();
 });
 $('#theFolders').val(0);
});

$('#theYear').on('mousedown', function () {
 $('#theFolders option').show().find('option:contains("Select")', this).attr('selected', 'selected');
});
tomjm
la source
0

Cette réponse acceptée ne semble pas correcte, tandis que .val ('newValue') est correct pour la fonction, essayer de récupérer une sélection par son nom ne fonctionne pas pour moi, j'ai dû utiliser l'identifiant et le nom de classe pour obtenir mon élément

Sam Alexander
la source
0

Voici une option facile. Définissez simplement votre option de liste, puis définissez son texte comme valeur sélectionnée:

$("#ddlScheduleFrequency option").selected(text("Select One..."));
DominionDave
la source
-1

Obtenez les enfants de la boîte de sélection; boucle à travers eux; lorsque vous avez trouvé celui que vous voulez, définissez-le comme l'option sélectionnée; renvoie false pour arrêter la boucle.

geowa4
la source