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.