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.