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.

DanSingerman
quelle
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>

Halbmond frisch
quelle
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); });
Spoulson
quelle
90

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

$("#my-Select option[text=" + myText +"]").prop("selected", true);
Jay Corbett
quelle
@ 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 :)

ErazerBrecht
quelle
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.

Russ Cam
quelle
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;
}
Dave
quelle
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.

Losbear
quelle
10

Diese Linie funktionierte:

$("#myDropDown option:contains(myText)").attr('selected', true);
Diego Unanue
quelle
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

aWebDeveloper
quelle
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.

RParker
quelle
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();
Pankaj Chauhan
quelle
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);

Vitor Silva
quelle
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.

Ammar Bukhari
quelle
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");

Chris Edwards
quelle
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; 
} 
Keith
quelle
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
quelle
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

Sam Alexander
quelle
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..."));
DominionDave
quelle
-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.

geowa4
quelle