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ć.


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>


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

90

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

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

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ć :)


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.


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

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.


10

Ta linia działała:

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

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


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.


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


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


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.


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");


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

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

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


0

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

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.