jQuery - установка выбранного значения элемента управления select через его текстовое описание


530

У меня есть элемент управления select, и в переменной javascript у меня есть текстовая строка.

Используя jQuery, я хочу установить выбранный элемент элемента управления select как элемент с текстовым описанием, которое у меня есть (в отличие от значения, которого у меня нет).

Я знаю, что установить его по значению довольно тривиально. например

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

Но я немного озадачен делать это через текстовое описание. Я предполагаю, что должен быть способ получить значение из текстового описания, но мой мозг слишком полдень в пятницу, чтобы быть в состоянии понять это.


1
@DanAtkinson собирался сделать то же самое сам. select не имеет абсолютно никакого отношения к этому вопросу.
thecoshman

Ответы:


757

Выбрать по описанию для 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>

Версии jQuery ниже 1.6 и выше или равные 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>

Обратите внимание, что хотя этот подход будет работать в версиях выше 1.6, но ниже 1.9, он не рекомендуется с 1.6. Это не будет работать в jQuery 1.9+.


Предыдущие версии

val() должен обрабатывать оба случая.

$('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
Такое ощущение, что это не должно работать (кажется, это может быть неоднозначным), но на самом деле это должно работать нормально для меня. Спасибо.
DanSingerman

69
Обратите внимание, что jQuery 1.4 теперь изменил это поведение, чтобы выбрать его, valueесли атрибут был указан, и выбирать только по тексту, если valueатрибут отсутствует. Таким образом, в этом примере $('select').val('Two')будет выбран второй вариант в 1.3.x, но ничего не будет сделано в 1.4.x.
Crescent Fresh

18
Итак, каков лучший способ сделать это в 1.4 сейчас?
JR Lawhorne

4
В более поздних версиях jQuery .val («not-a-option-value») сбрасывает выбор до первой опции.
Дланд

5
Первым ответом на этот вопрос, по-видимому, является сообщение о решении 1.3.x stackoverflow.com/questions/3644449/…
DA.

142

Я не проверял это, но это может сработать для вас.

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

90

Попробуйте это ..., чтобы выбрать вариант с текстом myText

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

Ответ @ Споулсона сработал для меня ... Я пытался сделать это без .each
Джей Корбетт

2
Во многих случаях этот подход не работает, к сожалению. Мне даже приходилось $("#my-Select option[text=" + myText +"]").get(0).selected = true;время от времени переходить на классический стиль: (...
Шахрияр Иманов

2
Убедитесь, что вы сначала удаляете выбранный атрибут перед повторной настройкой, в противном случае он будет не работать (работает для меня в 1.9)
esse

3
@MarkW Для 1.9 используйте .propвместо .attr; причина изменения в том, что в 1.9 jQuery отключил старые хаки, которые позволяют вам использовать .attrдля изменения некоторых свойств DOM, а также атрибутов HTML. (Google, javascript dom properties vs attributesесли вы не знаете различия.)
Марк Эми

Обновленный ответ для использования .prop('selected', true)вместо .attr('selected', 'selected')совместимости с jQuery 1.9+.
erwaman

43

Я делаю это таким образом (JQuery 1.9.1)

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

Примечание: не забудьте изменить (), мне пришлось долго искать из-за этого :)


2
Хотелось бы, чтобы я проголосовал несколько раз. Прошёл час, и я могу идти домой.
Боб Джордан

Отличный ответ! коротко и просто ... Это должно быть сверху ... Продолжайте голосовать.
Мухаммед Тарик

Это сработало в моем случае, спасибо! Но разве это не выбирается не отображаемым текстом, как запрошенный OP, а самим значением, которого у OP нет?
Брэндон Родс

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

вернет значение первой опции, содержащей ваше текстовое описание. Проверено это и работает.


Спасибо - я думаю, что это может быть версия, которую я использую, поскольку мне также нужно иметь логику для случаев, когда нет соответствующего текста, и это кажется самым простым механизмом для возможности сделать это.
Дан Сингерман

1
имейте в виду, он получит только значение для первого варианта, соответствующего тексту.
Расс Кэм

Кроме того, вы можете связать attr («выбранный», «выбранный») на упакованный набор вместо val (), и это будет работать аналогично ответу CarolinaJay65
Russ Cam

1
OP сказал « установка значения» не « получает значение»
RousseauAlexandre

15

Чтобы избежать всех сложностей в версии jQuery, я искренне рекомендую использовать одну из этих действительно простых функций 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;
}

Это позволяет выбрать опцию выбора через значение или текст (в зависимости от вызываемой функции). Например: setSelectByValue ('сосиски', '2'); Найдет и выберет вариант со значением «2» в объекте выбора с идентификатором «сосиски».
Дейв

2
@ Нил Э ... это отвечает на вопрос?
Марк Эмери

10

Я знаю, что это старый пост, но я не смог его выбрать по тексту, используя jQuery 1.10.3 и приведенные выше решения. В итоге я использовал следующий код (вариант решения Спулсона):

      var textToSelect = "Hello World";

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

Надеюсь, это кому-нибудь поможет.



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

Оператор if делает точное совпадение с «два» и «два три» не будут сопоставлены


Нет, я не это имел ввиду. Я думаю, что мой комментарий был немного неясен, поэтому я просто удалил его. Я все же одобрил ваш ответ, потому что он работал для моей ситуации.
Джагд

6

Самый простой способ с 1.7+ это:

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

1.9+

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

Проверено и работает.


1
Не в 1.9+ это не так. Начиная с .propверсии 1.6, вы должны использовать для изменения свойств DOM, а не .attr(что касается атрибутов HTML / DOM). См. Stackoverflow.com/q/5874652/1709587
Марк Эмери

Я бы использовал («выбранный», true) вместо истинного значения «выбранный»
mplungjan


4

взгляните на плагин jquery selectedbox

selectOptions(value[, clear]): 

Выберите параметры по значению, используя строку в качестве параметра $("#myselect2").selectOptions("Value 1");или регулярное выражение$("#myselect2").selectOptions(/^val/i); .

Вы также можете очистить уже выбранные опции: $("#myselect2").selectOptions("Value 2", true);


3

Просто на заметку. Мое выбранное значение не было установлено. И у меня был поиск по всей сети. На самом деле мне пришлось выбрать значение после обратного звонка из веб-службы, потому что я получал данные из него.

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

Таким образом, обновление селектора было единственным, что мне не хватало.


Это правильный вариант - хотя ... я не вижу причин для второй строки. Должен работать как есть.
Sagive SEO

2

Я обнаружил, что при использовании attrвы в конечном итоге выберете несколько вариантов, когда вы не захотите - решение заключается в использовании prop:

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


1

У меня была проблема с примерами, приведенными выше, и проблема была вызвана тем фактом, что значения моего поля выбора предварительно заполнены строками фиксированной длины из 6 символов, но передаваемый параметр не был фиксированной длины.

У меня есть функция rpad, которая будет дополнять строку справа, до указанной длины и с указанным символом. Итак, после заполнения параметра это работает.

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

Этот принятый ответ не кажется правильным, в то время как .val ('newValue') является правильным для функции, попытка получить выборку по его имени не работает для меня, мне пришлось использовать id и имя класса, чтобы получить мой элемент


0

Вот легкий вариант. Просто установите опцию списка, а затем установите его текст в качестве выбранного значения:

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

-1

Получите детей из поля выбора; цикл через них; когда вы нашли тот, который вы хотите, установите его в качестве выбранной опции; вернуть false, чтобы остановить цикл.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.