jQuery - встановлення вибраного значення елемента управління за допомогою його текстового опису


530

У мене є елемент управління, а у змінній 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.
Півмісяць Свіжий

18
Отже, який найкращий спосіб зробити це в 1.4 зараз?
JR Lawhorne

4
У останніх версіях jQuery .val ('не-значення-значення-опція') скине вибір до першого параметра.
длан

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

@ відповідь Spoulson спрацювала на мене ... Я намагався це зробити без .each
Jay Corbett

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
Бажаю, щоб я міг проголосувати кілька разів. Минув годину минулого часу, і тепер я можу йти додому.
Боб Джордан

Чудова відповідь! короткий і простий ... Це повинно бути зверху ... Продовжуйте голосувати.
Мухаммед Тарік

Це спрацювало в моєму випадку, дякую! Але це не вибирається не текстом, що відображається, як вимагає ОП, а самим значенням, яке ОП не має?
Брендон Родос

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

поверне значення першого варіанту, що містить ваш опис тексту. Випробував це і працює.


Дякую - я думаю, що це може бути версія, яку я використовую, оскільки мені також потрібно мати логіку, коли немає відповідного тексту, і це здається найпростішим механізмом для того, щоб можна було це зробити.
DanSingerman

1
майте на увазі, воно отримає лише значення для першого варіанту, що відповідає тексту.
Russ Cam

Крім того, ви можете ланцюг attr ("вибраний", "вибраний") на обгорнутій наборі замість val (), і це буде працювати аналогічно відповіді CarolinaJay65
Russ Cam

1
ОП заявив, що " встановлення значення" не " отримання значення"
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
@Neal Uh ... це відповідає на питання?
Марк Амерді

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 відповідає точному збігу з "two" і "two three" не буде збігатися


Ні, це не те, що я мав на увазі. Я думаю, що мій коментар був трохи незрозумілим, тому я його просто видалив. Я відповів на вашу відповідь, бо це спрацювало на мою ситуацію.
Jagd

6

Найпростіший спосіб з 1.7+:

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

1.9+

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

Тестується і працює.


1
Не в 1.9+ це не так. З 1.6 ви повинні використовувати .propдля зміни властивостей DOM, а не .attr(це для атрибутів HTML / DOM). Дивіться stackoverflow.com/q/5874652/1709587
Марк Амері

Я б використав ("вибраний", правда) замість трибунного значення "вибраний"
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);

Тож оновлення селектора було єдиним, що мені не вистачало.


Це правильний варіант - хоча і не бачу причини для другого рядка. Потрібно працювати так, як є.
Пробачте 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

Дістаньте дітям вікно вибору; петля через них; знайшовши потрібного, встановіть його як обраний варіант; повернути помилкове, щоб перестати циклічно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.