Який селектор мені потрібно вибрати варіант за його текстом?


207

Мені потрібно перевірити, чи <select>є опція, текст якої дорівнює певному значенню.

Наприклад, якщо є <option value="123">abc</option>, я б шукав "abc".

Чи є селектор для цього?

Я шукаю щось подібне, $('#select option[value="123"]');але не для тексту.


Хм ... відповідь hasу SLaks корисна, але пункт у відповіді Флойда також хороший ... Я не знаю, що прийняти.
Гейлвуд

також, чи ці чутливі до регістру? (Я шукаю нечутливість до випадків і завжди може просто перейти на нижчу
Гайлуд,

1
Я використовую основну функцію JavaScript .toLowerCase () та порівнюю, якщо потрібна нечутливість до регістру. Крім того, прийміть як відповідь той, який є найбільш корисним для вашого поставленого питання. :)
Hari Pachuveetil

він не працює для випадаючого меню з багатоселекторним API ?? Я спробував усі можливі рішення, але не пощастило. Я використовую мультиселективний інтерфейс API eric hynd. Чи може хтось вирішити цю проблему?
Чайтанья Чандукар

Відповіді:


320

Це може допомогти:

$('#test').find('option[text="B"]').val();

Демо-скрипка

Це дасть вам можливість з текстом, Bа не з текстом , який містить текст B. Сподіваюсь, це допомагає

Для останніх версій jQuery вище не працює. Як прокоментував Quandary нижче, саме це працює для jQuery 1.9.1:

$('#test option').filter(function () { return $(this).html() == "B"; }).val();

Оновлена ​​скрипка


1
це не працює з останніми версіями jquery (якщо ви вилучите 'value =' з <option>)
KevinDeus

27
@KevinDeus: Чому голосування !? Тоді відповідь була версія jQuery!
Харі Пачуветіль

11
Натомість використовуйте $ ('# test test'). Filter (function () {return $ (this) .html () == "B";}). Val ();
Стефан Штайгер

84
@ Quandary Тим не менш, це не вагома причина голосувати за відповідь, коли короткого коментаря буде достатньо. Або ви очікуєте, що він повторно перевірить усі свої відповіді на кожен новий випуск jQuery?
WynandB

2
Я думаю, що нижченаведена оцінка пов'язана з тим, що вищенаведений приклад просто знаходить вибране значення, а не встановлює вибране значення.
nivs1978

133

Ви можете використовувати :contains()селектор для вибору елементів, що містять конкретний текст.
Наприклад:

$('#mySelect option:contains(abc)')

Щоб перевірити, чи є у певного <select>елемента такий варіант, скористайтеся .has()методом :

if (mySelect.has('option:contains(abc)').length)

Щоб знайти всі <select>s, які містять таку опцію, скористайтесь :has()селектором :

$('select:has(option:contains(abc))')

3
:containsзараз не є остаточним, чи не так?
Харі Пачуветил

У чому полягає проблема, що саме містить?
Ogier Schelvis

як би ви це зробили лише з вибраними параметрами?
toddmo

Це також не захоплює варіант 123abcdef?
Teepeemm

@Teepeemm Так, це різниця між двома основними відповідями. Верхній прапорець повертає опцію лише з певним текстом, цей повертає опцію, яка містить, але не тільки, певний текст. Що, навпаки, те, що мені насправді потрібно в даний момент, тому я дуже радий це опублікував.
Лі А.

30

Жодна з попередніх пропозицій не працювала для мене в jQuery 1.7.2, оскільки я намагаюся встановити вибраний індекс списку на основі значення з текстового поля, а деякі текстові значення містяться в декількох варіантах. Я в кінцевому рахунку використовував наступне:

$('#mySelect option:contains(' + value + ')').each(function(){
    if ($(this).text() == value) {
        $(this).attr('selected', 'selected');
        return false;
    }
    return true;
});

1
Я думаю, що це найкраща відповідь, оскільки вона фактично повертає правильні результати. Але я не можу допомогти, але думаю, що пропущення containsзовсім може насправді прискорити справи.
стайф

Це працювало для мене, але в моєму сценарії я міг натиснути редагування на сітці кілька разів, тому довелося видалити вибраний атрибут, коли не було відповідності, інакше перша обрана опція залишиться для наступних редагувань. else {$ (this) .attr ('вибрано', ''); повернути помилкове; }
esp

Це рішення працювало для мене, але замість того, щоб встановити атрибут параметра, щоб фактично змінити меню вибору, яке мені потрібно було зробити: $(this).parent().val($(this).val()); Ви, ймовірно, могли робити і те, і інше, якщо для мене встановив лише батьків val().
billynoah


15

Це працювало для мене: $("#test").find("option:contains('abc')");


3
Вам слід додати пояснення, чому це працює також.
Hannes Johansson

@HannesJohansson Або він повинен хоча б пояснити, чим це відрізняється, або додати щось нове у відповідь SLaks, що майже на п’ять років старший. ; ^)
рюш

4
Будьте впевнені, що розумієте, що і цей варіант знайде: <option> abcd </option>.
Чарльз

Дякую, це безумовно правильно, і те, що всі пропустили, додає .attr ('value'); до кінця. Це найпростіший спосіб насправді отримати значення для використання в динамічній формі! Тож повний код повинен виглядати таким. $("#testselect").find("option:contains('option-text')").attr('value'); таким чином ви можете використовувати подію, якби .click()змінити налаштування.
ChrisKsag

12

Це найкращий метод для вибору тексту у спадному списку.

$("#dropdownid option:contains(your selected text)").attr('selected', true);

3
Як і у відповідних відповідях, і цей варіант знайде варіант this is your selected text plus more.
Teepeemm

4

Я спробував декілька таких речей, поки не отримав одну роботу в Firefox та IE. Це те, що я придумав.

$("#my-Select").val($("#my-Select" + " option").filter(function() { return this.text == myText }).val());

ще один спосіб його написання в більш читаному вигляді:

var valofText = $("#my-Select" + " option").filter(function() {
    return this.text == myText
}).val();
$(ElementID).val(valofText);

Псевдокод:

$("#my-Select").val( getValOfText( myText ) );

Має сенс у останніх версіях jQuery
Fr0zenFyr

У чому сенс "#my-Select" + " option"? Чому б не просто "#my-Select option"?
Teepeemm

3

Використовуйте наступне

$('#select option:contains(ABC)').val();

1
наданий вами код може вирішити проблему, але, будь ласка, додайте короткий опис того, як це вирішує проблему. Ласкаво просимо до переповнення стека, рекомендується прочитати Як відповісти .
Dan Beaulieu

3
якщо є якісь варіанти: ABC, ABCD, ABCDEF, то?
Hungndv

1

Це буде працювати в jQuery 1.6 (відзначте двокрапку перед початковою дужкою), але не вдасться до нових версій (на той час 1.10).

$('#mySelect option:[text=abc]")

5
Цікаво, але, на жаль, це не працює (jQuery 1.10.2).
WynandB

Ви хочете включити, що щось на кшталт $("#mySelect option").filter(function() { return this.text == "abc"; });буде працювати з останніми версіями jQuery .. Або, мабуть, якийсь інший спосіб, який ви віддаєте перевагу використовувати ..
Fr0zenFyr

1

Для jquery версія 1.10.2 нижче працювала для мене

  var selectedText="YourMatchText";
    $('#YourDropdownId option').map(function () {
       if ($(this).text() == selectedText) return this;
      }).attr('selected', 'selected');
    });


0

Це працює для мене:

var result = $('#SubjectID option')
            .filter(function () 
             { return $(this).html() == "English"; }).val();

resultМінлива повертає індекс співпала значення тексту. Тепер я просто встановлю його за допомогою свого індексу:

$('#SubjectID').val(result);

-1

Або ви повторите параметри, або введіть один і той же текст всередину іншого атрибута параметра та виберіть його.


-1

Це також спрацює.

$ ('# test'). find ("вибір параметра: містить ('B')"). filter (": вибрано");


2
Це також захопить варіант ABC.
Teepeemm

-1

Як описано в цій відповіді , ви можете легко створити власний селектор для hasText. Це дозволяє знайти варіант за допомогою$('#test').find('option:hastText("B")').val();

Ось я додав метод hasText:

 if( ! $.expr[':']['hasText'] ) {
     $.expr[':']['hasText'] = function( node, index, props ) {
       var retVal = false;
       // Verify single text child node with matching text
       if( node.nodeType == 1 && node.childNodes.length == 1 ) {
         var childNode = node.childNodes[0];
         retVal = childNode.nodeType == 3 && childNode.nodeValue === props[3];
       }
       return retVal;
     };
  }

-2

Це працює для мене

var options = $(dropdown).find('option');
var targetOption = $(options).filter(
function () { return $(this).html() == value; });

console.log($(targetOption).val());

Дякую за всі повідомлення.

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