jQuery - Festlegen des ausgewählten Werts eines ausgewählten Steuerelements über dessen Textbeschreibung


530

Ich habe ein Auswahlsteuerelement und in einer Javascript-Variablen habe ich eine Textzeichenfolge.

Mit jQuery möchte ich das ausgewählte Element des Auswahlsteuerelements als das Element mit der Textbeschreibung festlegen, die ich habe (im Gegensatz zu dem Wert, den ich nicht habe).

Ich weiß, dass es ziemlich trivial ist, es nach Wert zu setzen. z.B

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

Aber ich bin ein bisschen ratlos, wenn ich es über die Textbeschreibung mache. Ich denke, es muss eine Möglichkeit geben, den Wert aus der Textbeschreibung herauszuholen, aber mein Gehirn ist zu freitagnachmittags, um es herausfinden zu können.


1
@ DanAtkinson wollte das Gleiche selbst tun. select hat absolut nichts mit dieser Frage zu tun.
Thecoshman

Antworten:


757

Wählen Sie anhand der Beschreibung für jQuery v1.6 + aus

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>

jQuery-Versionen unter 1.6 und größer oder gleich 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>

Beachten Sie, dass dieser Ansatz zwar in Versionen funktioniert, die über 1.6, aber unter 1.9 liegen, jedoch seit 1.6 veraltet ist. Es wird nicht funktionieren , in jQuery 1.9+.


Vorherige Versionen

val() sollte beide Fälle behandeln.

$('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
Das fühlt sich so an, als ob es nicht funktionieren sollte (es scheint, dass es mehrdeutig sein könnte), aber es sollte tatsächlich gut für mich funktionieren. Vielen Dank.
DanSingerman

69
Beachten Sie, dass jQuery 1.4 dieses Verhalten jetzt so geändert hat, dass es ausgewählt wird, valuewenn das Attribut angegeben wurde, und nur per Text ausgewählt wird, wenn das valueAttribut fehlt. In diesem Beispiel $('select').val('Two')wird also die zweite Option in 1.3.x ausgewählt, in 1.4.x jedoch nichts.
Crescent Fresh

18
Also, wie geht das jetzt in 1.4 am besten?
JR Lawhorne

4
In neueren Versionen von jQuery setzt .val ('kein Optionswert') die Auswahl auf die erste Option zurück.
Dland

5
Die erste Antwort auf diese Frage scheint die Lösung nach 1.3.x stackoverflow.com/questions/3644449/…
DA zu sein.

142

Ich habe das nicht getestet, aber das könnte für Sie funktionieren.

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

90

Versuchen Sie dies ... um die Option mit dem Text myText auszuwählen

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

@ Spoulson Antwort hat für mich funktioniert ... Ich habe versucht, es ohne die .each
Jay Corbett

2
In vielen Fällen funktioniert dieser Ansatz leider nicht. $("#my-Select option[text=" + myText +"]").get(0).selected = true;Von Zeit zu Zeit musste ich mich sogar zum klassischen Stil entschließen : (...
Shahriyar Imanov

2
Stellen Sie sicher, dass Sie zuerst das ausgewählte Attribut entfernen, bevor Sie es neu einstellen. Andernfalls scheint es nicht zu funktionieren (funktioniert für mich in 1.9)
esse

3
@MarkW Verwenden Sie für 1.9 .propanstelle von .attr; Die Ursache für die Änderung ist, dass jQuery in 1.9 die alten Hacks deaktiviert hat, mit denen Sie .attreinige DOM-Eigenschaften sowie HTML-Attribute ändern können. (Google, javascript dom properties vs attributeswenn Sie den Unterschied nicht kennen.)
Mark Amery

Aktualisierte Antwort zur Verwendung .prop('selected', true)anstelle der .attr('selected', 'selected')Kompatibilität mit jQuery 1.9+.
Erwaman

43

Ich mache es auf diese Weise (jQuery 1.9.1)

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

Hinweis: Vergessen Sie nicht die Änderung (), ich musste deswegen zu lange suchen :)


2
Ich wünschte, ich könnte mehrmals upvoten. Es ist eine Stunde nach dem Ende und jetzt kann ich nach Hause gehen.
Bob Jordan

Gute Antwort! kurz und einfach ... Dies sollte oben sein ... Stimmen Sie weiter ab.
Muhammad Tarique

Das hat in meinem Fall funktioniert, danke! Aber wählt dies nicht nicht nach dem angezeigten Text, wie vom OP angefordert, sondern nach dem Wert selbst, den das OP nicht hat?
Brandon Rhodes

21
$("#myselect option:contains('YourTextHere')").val();

gibt den Wert der ersten Option zurück, die Ihre Textbeschreibung enthält. Getestet und funktioniert.


Danke - ich denke, dies könnte die Version sein, die ich verwende, da ich auch Logik haben muss, wenn es keinen passenden Text gibt, und dies scheint der einfachste Mechanismus zu sein, um dies zu tun.
DanSingerman

1
Beachten Sie, dass nur der Wert für die erste Option angezeigt wird, die dem Text entspricht.
Russ Cam

Außerdem könnten Sie attr ("ausgewählt", "ausgewählt") anstelle von val () an das verpackte Set ketten, und dies würde ähnlich wie die Antwort von CarolinaJay65 funktionieren
Russ Cam

1
OP sagte Einstellung Wert“ nicht bekommen Wert“
RousseauAlexandre

15

Um alle Komplikationen der jQuery-Version zu vermeiden, empfehle ich ehrlich, eine dieser wirklich einfachen Javascript-Funktionen zu verwenden ...

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

Es ermöglicht die Auswahl einer Auswahloption über Wert oder Text (abhängig von der aufgerufenen Funktion). Zum Beispiel: setSelectByValue ('Würstchen', '2'); Findet und wählt die Option mit dem Wert "2" im Auswahlobjekt mit der ID "Würstchen" aus.
Dave

2
@Neal Äh ... beantwortet es die Frage?
Mark Amery

10

Ich weiß, dass dies ein alter Beitrag ist, aber ich konnte ihn mit jQuery 1.10.3 und den oben genannten Lösungen nicht per Text auswählen. Am Ende habe ich den folgenden Code verwendet (Variation der Spoulson-Lösung):

      var textToSelect = "Hello World";

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

Hoffe es hilft jemandem.


10

Diese Linie funktionierte:

$("#myDropDown option:contains(myText)").attr('selected', true);

7
 $("#Test").find("option:contains('two')").each(function(){
     if( $(this).text() == 'two' ) {
        $(this).attr("selected","selected");
     }
 });

Die if-Anweisung stimmt genau mit "zwei" und "zwei drei" überein


Nein, das habe ich nicht gemeint. Ich denke, mein Kommentar war etwas unklar, deshalb habe ich ihn einfach gelöscht. Ich habe Ihre Antwort jedoch positiv bewertet, weil sie für meine Situation funktioniert hat.
Jagd

6

Der einfachste Weg mit 1.7+ ist:

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

1,9+

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

Getestet und funktioniert.


1
Nicht in 1.9+ ist dies nicht der Fall. Seit 1.6 sollten Sie verwenden .prop, um DOM-Eigenschaften zu ändern, nicht .attr(dies gilt für HTML / DOM-Attribute). Siehe stackoverflow.com/q/5874652/1709587
Mark Amery

Ich würde ("ausgewählt", wahr) anstelle des wahrheitsgemäßen Wertes von "ausgewählt" verwenden
mplungjan

5

Hier ist ein sehr einfacher Weg. Bitte benutzen Sie es

$("#free").val("y").change();

4

Schauen Sie sich das Plugin jquery selectedbox an

selectOptions(value[, clear]): 

Wählen Sie Optionen nach Wert aus, indem Sie eine Zeichenfolge als Parameter $("#myselect2").selectOptions("Value 1");oder einen regulären Ausdruck verwenden$("#myselect2").selectOptions(/^val/i); .

Sie können auch bereits ausgewählte Optionen löschen: $("#myselect2").selectOptions("Value 2", true);


3

Nur eine Randnotiz. Mein ausgewählter Wert wurde nicht festgelegt. Und ich hatte überall im Netz gesucht. Eigentlich musste ich nach einem Rückruf von einem Webdienst einen Wert auswählen, weil ich Daten von ihm bekam.

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

Die Aktualisierung des Selektors war also das einzige, was mir fehlte.


Dies ist die richtige - obwohl ... ich sehe keinen Grund für die zweite Zeile. Sollte funktionieren wie es ist.
Sagive SEO

2

Ich habe festgestellt, dass bei Verwendung attrmehrere Optionen ausgewählt werden, wenn Sie dies nicht möchten. Die Lösung besteht darin, Folgendes zu verwenden prop:

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


1

Ich hatte ein Problem mit den obigen Beispielen, und das Problem wurde durch die Tatsache verursacht, dass meine Auswahlfeldwerte mit Zeichenfolgen fester Länge von 6 Zeichen vorgefüllt sind, der übergebene Parameter jedoch keine feste Länge hatte.

Ich habe eine RPAD-Funktion, die einen String mit der angegebenen Länge und dem angegebenen Zeichen nach rechts auffüllt. Nach dem Auffüllen des Parameters funktioniert es also.

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


function rpad(pStr, pLen, pPadStr) {
if (pPadStr == '') {pPadStr == ' '};
while (pStr.length < pLen)
    pStr = pStr + pPadStr;
return pStr; 
} 

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

0

Diese akzeptierte Antwort scheint nicht korrekt zu sein, während .val ('newValue') für die Funktion korrekt ist. Der Versuch, eine Auswahl anhand ihres Namens abzurufen, funktioniert bei mir nicht. Ich musste die ID und den Klassennamen verwenden, um mein Element abzurufen


0

Hier ist eine einfache Option. Legen Sie einfach Ihre Listenoption fest und legen Sie den Text als ausgewählten Wert fest:

$("#ddlScheduleFrequency option").selected(text("Select One..."));

-1

Holen Sie sich die Kinder des Auswahlfeldes; Schleife durch sie; Wenn Sie die gewünschte gefunden haben, legen Sie sie als ausgewählte Option fest. Geben Sie false zurück, um die Schleife zu beenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.