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.