我需要哪个选择器通过其文本选择一个选项?


207

我需要检查a <select>是否具有其文本等于特定值的选项。

例如,如果有<option value="123">abc</option>,我会寻找“ abc”。

有选择器可以做到这一点吗?

我正在寻找与$('#select option[value="123"]');文字类似的东西。


嗯... has在SLaks答案中很有用,但在Floyds答案中也很重要...我不知道该接受什么。
希尔伍德2010年

另外,这些是否区分大小写?(我正在寻找不区分大小写的方法,可以始终将其转换为较低的值
Hailwood 2010年

1
如果需要不区分大小写,我使用JavaScript核心函数.toLowerCase()进行比较。另外,接受对您的问题最有用的答案。:)
Hari Pachuveetil 2010年

对于具有多选API的下拉列表不起作用?我尝试了所有可能的解决方案,但没有运气。我正在使用eric hynd的multiselect dropdowm API。谁能解决这个问题?
Chaitanya Chandurkar

Answers:


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(如果从<option>中删除“ value =”)
KevinDeus,2011年

27
@KevinDeus:为什么要投反对票!答案是当时的jQuery版本!
哈里·帕丘韦蒂尔

11
而是使用$('#test option')。filter(function(){return $(this).html()==“ B”;})。val();
Stefan Steiger

84
@Quandary尽管如此,当简短的评论就足够时,将答案否决还是一个不合理的理由。还是您期望他为每个新版本的jQuery重新测试他的所有答案?
WynandB

2
我认为不赞成投票的原因是上述示例仅找到所选值,而不设置所选值。
nivs1978 '19

133

您可以使用 :contains()选择器选择包含特定文本的元素。
例如:

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

检查是否给定 <select>元素具有这样的选项,请使用.has()方法

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

要查找<select>包含此类选项的所有,请使用:has()选择器

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

3
:contains现在不是确定的,是吗?
Hari Pachuveetil 2010年

包含到底有什么问题?
Ogier Schelvis

仅使用选定的选项,您将如何做呢?
toddmo

这不是也可以选择123abcdef吗?
Teepeemm '18

@Teepeemm是的,这是两个最重要答案之间的区别。最上面的检查仅返回带有特定文本的选项,此选项返回包含但不仅限于该特定文本的选项。碰巧的是,这正是我目前真正需要的,因此我很高兴将其发布。
Lee A.

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完全省去实际上可能会加快速度。
styfle 2012年

这对我有用,但是在我的场景中,我可以多次单击网格上的“编辑”,因此在没有匹配项时必须删除选定的属性,否则,选择的第一个选项将保留给以后的编辑。否则{$(this).attr('selected',''); 返回false;}
特别是

此解决方案对我有用,但实际上不是更改选项属性,而是更改我需要执行的选择菜单:$(this).parent().val($(this).val()); 您可能可以同时执行这两个操作,但对我来说,仅设置父级val()就可以了。
billynoah


15

这为我工作: $("#test").find("option:contains('abc')");


3
您应该添加一个解释为什么它也可以正常工作。
汉尼斯·约翰逊

@HannesJohansson或者,他至少应该解释一下它与SLaks答案有何不同,或者为它增加了将近5年之久。; ^)
ruffin

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 2015年

有什么意义"#my-Select" + " option"?为什么不只是"#my-Select option"呢?
Teepeemm


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(“ select option:contains('B')”)。filter(“:selected”);


2
这也会抓住选项ABC
Teepeemm '18

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

感谢所有帖子。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.