jQuery - ustawianie wybranej wartości kontrolki wyboru za pomocą opisu tekstowego

530

Mam kontrolę wyboru, aw zmiennej javascript mam ciąg tekstowy.

Za pomocą jQuery chcę ustawić wybrany element formantu select jako element z opisem tekstowym, który mam (w przeciwieństwie do wartości, której nie mam).

Wiem, że ustawienie wartości jest dość proste. na przykład

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

Ale jestem trochę zakłopotany robieniem tego za pomocą opisu tekstowego. Wydaje mi się, że musi istnieć sposób na wydobycie wartości z opisu tekstowego, ale mój mózg jest zbyt piątek po południu, aby móc to wypracować.

DanSingerman
źródło
1
@ DanAtkinson miał zrobić to samo. select nie ma absolutnie nic wspólnego z tym pytaniem.
thecoshman

Odpowiedzi:

757

Wybierz według opisu dla 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>

Wersje jQuery poniżej 1.6 i większe lub równe 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>

Zwróć uwagę, że chociaż to podejście będzie działać w wersjach powyżej 1.6, ale mniejszych niż 1.9, to jest ono przestarzałe od 1.6. Nie będzie działać w jQuery 1.9+.


Poprzednie wersje

val() powinien obsługiwać oba przypadki.

$('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>

Półksiężyc Świeży
źródło
6
To wydaje się, że nie powinno działać (wydaje się, że może być dwuznaczne), ale tak naprawdę powinno działać dobrze dla mnie. Dzięki.
DanSingerman
69
Zauważ, że jQuery 1.4 zmieniło teraz to zachowanie, aby wybrać, valuejeśli atrybut został określony, i wybierz tylko tekstem, jeśli valueatrybutu brakuje. W tym przykładzie $('select').val('Two')wybiorę drugą opcję w 1.3.x, ale nic nie zrobimy w 1.4.x.
Crescent Fresh
18
Więc jaki jest najlepszy sposób, aby to zrobić teraz w wersji 1.4?
JR Lawhorne,
4
W nowszych wersjach jQuery, .val ('not-an-opcja-value') zresetuje zaznaczenie do pierwszej opcji.
dland
5
Pierwszą odpowiedzią na to pytanie wydaje się być rozwiązanie po wersji 1.3.x stackoverflow.com/questions/3644449/…
DA.
142

Nie testowałem tego, ale to może działać dla ciebie.

$("select#my-select option")
   .each(function() { this.selected = (this.text == myVal); });
spoulson
źródło
90

Spróbuj tego ..., aby wybrać opcję z tekstem myText

$("#my-Select option[text=" + myText +"]").prop("selected", true);
Jay Corbett
źródło
Odpowiedź @ spoulsona zadziałała dla mnie ... Próbowałem to zrobić bez .each
Jay Corbett
2
W wielu przypadkach takie podejście nie działa niestety. $("#my-Select option[text=" + myText +"]").get(0).selected = true;Od czasu do czasu musiałem nawet przejść do klasycznego stylu: (...
Shahriyar Imanov
2
Upewnij się, że najpierw usuwasz wybrany atrybut przed ponownym ustawieniem, w przeciwnym razie okaże się, że nie działa (działa dla mnie w wersji 1.9)
esse
3
@ MarkW W wersji 1.9 użyj .propzamiast .attr; przyczyną zmiany jest to, że w 1.9 jQuery wyłączył stare hacki, które pozwalają .attrna zmianę niektórych właściwości DOM, a także atrybutów HTML. (Google, javascript dom properties vs attributesjeśli nie znasz rozróżnienia.)
Mark Amery
Zaktualizowana odpowiedź do użycia .prop('selected', true)zamiast .attr('selected', 'selected')do kompatybilności jQuery 1.9+.
erwaman
43

Robię to w ten sposób (jQuery 1.9.1)

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

Uwaga: nie zapomnij o zmianie (), musiałem za długo szukać :)

ErazerBrecht
źródło
2
Chciałbym móc głosować wiele razy. Minęła godzina odejścia, a teraz mogę iść do domu.
Bob Jordan
Świetna odpowiedź! krótko i prosto ... To powinno być na górze ... Kontynuuj głosowanie.
Muhammad Tarique
To zadziałało w moim przypadku, dzięki! Ale czy nie wybiera tego nie wyświetlany tekst, zgodnie z żądaniem PO, ale sama wartość, której PO nie ma?
Brandon Rhodes
21
$("#myselect option:contains('YourTextHere')").val();

zwróci wartość pierwszej opcji zawierającej opis tekstowy. Testowałem to i działa.

Russ Cam
źródło
Dzięki - myślę, że to może być wersja, której używam, ponieważ muszę mieć logikę, gdy nie ma pasującego tekstu, i wydaje się to najłatwiejszym mechanizmem, aby to zrobić.
DanSingerman
1
pamiętaj, że otrzyma tylko wartość dla pierwszej opcji pasującej do tekstu.
Russ Cam
Ponadto możesz połączyć łańcuch attr („selected”, „selected”) z zawiniętym zestawem zamiast val (), a to działałoby podobnie do odpowiedzi CarolinaJay65
Russ Cam
1
OP powiedział ustawianie wartości”, a nie uzyskiwanie wartości”
RousseauAlexandre
15

Aby uniknąć komplikacji wersji jQuery, szczerze polecam użycie jednej z tych naprawdę prostych funkcji javascript ...

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
źródło
Umożliwia wybór opcji wyboru za pomocą wartości lub tekstu (w zależności od wywoływanej funkcji). Na przykład: setSelectByValue („kiełbaski”, „2”); Znajduje i wybiera opcję o wartości „2” w obiekcie wyboru o identyfikatorze „kiełbaski”.
Dave
2
@Neal Uh ... odpowiada na pytanie?
Mark Amery
10

Wiem, że to stary post, ale nie udało mi się go wybrać tekstem za pomocą jQuery 1.10.3 i powyższych rozwiązań. Skończyło się na użyciu następującego kodu (odmiana rozwiązania Spoulsona):

      var textToSelect = "Hello World";

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

Mam nadzieję, że to komuś pomoże.

Losbear
źródło
10

Ta linia działała:

$("#myDropDown option:contains(myText)").attr('selected', true);
Diego Unanue
źródło
7
 $("#Test").find("option:contains('two')").each(function(){
     if( $(this).text() == 'two' ) {
        $(this).attr("selected","selected");
     }
 });

Instrukcja if pasuje dokładnie do „dwa” i „dwa trzy” nie zostanie dopasowana

aWebDeveloper
źródło
Nie, nie o to mi chodziło. Myślę, że mój komentarz był trochę niejasny, więc właśnie go usunąłem. Głosowałem jednak za odpowiedzią, ponieważ zadziałało w mojej sytuacji.
Jagd
6

Najłatwiejszym sposobem w wersji 1.7+ jest:

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

1.9+

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

Testowane i działa.

RParker
źródło
1
Nie w wersji 1.9+ tak nie jest. Od wersji 1.6 należy .propzmieniać właściwości DOM, a nie .attr(dotyczy to atrybutów HTML / DOM). Zobacz stackoverflow.com/q/5874652/1709587
Mark Amery
Chciałbym użyć („wybrane”, prawda) zamiast prawdziwej wartości „wybrane”
mplungjan
5

Oto bardzo prosty sposób. proszę użyć tego

$("#free").val("y").change();
Pankaj Chauhan
źródło
4

spójrz na wtyczkę selectedbox jquery

selectOptions(value[, clear]): 

Wybierz opcje według wartości, używając łańcucha jako parametru $("#myselect2").selectOptions("Value 1");lub wyrażenia regularnego $("#myselect2").selectOptions(/^val/i);.

Możesz także wyczyścić już wybrane opcje: $("#myselect2").selectOptions("Value 2", true);

Vitor Silva
źródło
3

Tylko na marginesie. Moja wybrana wartość nie została ustawiona. I przeszukałem całą sieć. Właściwie musiałem wybrać wartość po oddzwonieniu z usługi internetowej, ponieważ otrzymywałem z niej dane.

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

Odświeżenie selektora było jedyną rzeczą, której mi brakowało.

Ammar Bukhari
źródło
To jest właściwe - chociaż ... nie widzę powodu do drugiej linii. Powinien działać tak, jak jest.
Sagive SEO,
2

Zauważyłem, że korzystając z attrniego skończysz z wieloma opcjami wybranymi, gdy nie chcesz - rozwiązaniem jest użycie prop:

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

Chris Edwards
źródło
1

Miałem problem z powyższymi przykładami, a problem był spowodowany faktem, że moje wartości pola wyboru są wypełnione ciągami o stałej długości 6 znaków, ale przekazywany parametr nie był stałej długości.

Mam funkcję rpad, która wyrówna ciąg znaków do określonej długości i określonego znaku. Po uzupełnieniu parametru działa.

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


function rpad(pStr, pLen, pPadStr) {
if (pPadStr == '') {pPadStr == ' '};
while (pStr.length < pLen)
    pStr = pStr + pPadStr;
return pStr; 
} 
Keith
źródło
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
źródło
0

Ta zaakceptowana odpowiedź nie wydaje się poprawna, podczas gdy .val ('newValue') jest poprawny dla funkcji, próba odzyskania zaznaczenia po nazwie nie działa dla mnie, musiałem użyć identyfikatora i nazwy klasy, aby uzyskać mój element

Sam Alexander
źródło
0

Oto prosta opcja. Wystarczy ustawić opcję listy, a następnie ustawić tekst jako wybraną wartość:

$("#ddlScheduleFrequency option").selected(text("Select One..."));
DominionDave
źródło
-1

Pobierz dzieci z wybranego pola; przechodzić przez nie; gdy znajdziesz ten, który chcesz, ustaw go jako wybraną opcję; zwraca false, aby zatrzymać zapętlenie.

geowa4
źródło