2013-03-12 83 views
114

所有正确的精确匹配选择元素,我不知道是否有一种方法可以使:contains() jQuery的选择器选择与是在其内容

输入例如字符串元素 -

<p>hello</p> 
<p>hello world</p> 

$('p:contains("hello")').css('font-weight', 'bold'); 

选择器将选择两个p元素并使它们变为粗体,但我希望它只选择第一个。

+0

那么它不会工作,你可以覆盖':用自己的代码contains'选择,但我不认为这就是你是什么意思? – Blazemonger 2013-03-12 14:43:04

+0

http://stackoverflow.com/questions/813477/jquery-selector-where-text-some-value – Dom 2013-03-12 14:43:48

+0

你可以定义一个自定义选择器:http://stackoverflow.com/questions/12244929/jquery-custom-selector- undefined – BLSully 2013-03-12 14:44:05

回答

160

不,没有这样做的jQuery(或CSS)选择器。

你可以很容易地使用filter

$("p").filter(function() { 
    return $(this).text() === "hello"; 
}).css("font-weight", "bold"); 

这不是一个选择,但它的工作。 :-)

如果你想之前或之后办理的空白“你好”,你可以在那里扔一个$.trim

return $.trim($(this).text()) === "hello"; 

对于过早的优化在那里,如果你不关心它不匹配<p><span>hello</span></p>和类似的,你可以直接使用innerHTML避免$text来电:

return this.innerHTML === "hello"; 

...但你必须有一个很多它的重要段落,很多,你可能会首先遇到其他问题。 :-)

+7

可能还想''.trim'它在进行比较之前有任何空白空白。 – Blazemonger 2013-03-12 14:43:54

+0

出于某种原因,我不得不使用“==”这个工作,而不是“===”。 – Stephan 2015-01-22 05:36:44

+3

@Stephan:如果你正在比较一个数字,你必须使用==(== 2)或者把数字放在一个字符串中(===“2”'),因为你从text()或innerHTML获得的值总是一个字符串。如果你使用字符串进行比较,那么使用'=='还是'==='无关紧要。 – 2015-01-22 07:38:27

8

你可以使用jQuery的filter()函数来实现这一点。

$("p").filter(function() { 
// Matches exact string 
return $(this).text() === "Hello World"; 
}).css("font-weight", "bold"); 
-4

的。首先()将在这里帮助

$('p:contains("hello")').first().css('font-weight', 'bold'); 
+0

当然......在这个特定的情况下。如果订单在开发时间不知道怎么办? – BLSully 2013-03-12 14:44:59

+0

帮助我实际上欢呼 – 2016-03-06 23:20:32

40

尝试添加一个扩展伪功能:

$.expr[':'].textEquals = $.expr.createPseudo(function(arg) { 
    return function(elem) { 
     return $(elem).text().match("^" + arg + "$"); 
    }; 
}); 

然后,你可以这样做:

$('p:textEquals("Hello World")'); 
+0

伟大的解决方案:小额外:确保您不覆盖现有的expr,我会这样做:''。$ .expr [':']。textEquals = $ .expr [':' ] .textEquals || $ .expr.createPseudo(function(arg){''' – 2018-03-08 12:46:06

8

所以Amandu的答案主要是作品。然而,在野外使用它,我遇到了一些问题,我预计会发现的事情没有找到。这是因为有时在元素的文本周围会出现随机的空白区域。我相信,如果你正在寻找“Hello World”,你仍然希望它匹配“Hello World”,甚至是“Hello World \ n”。因此,我只是将“trim()”方法添加到该函数中,该函数移除了周围的空白,并且它开始工作得更好。

具体...

$.expr[':'].textEquals = function(el, i, m) { 
    var searchText = m[3]; 
    var match = $(el).text().trim().match("^" + searchText + "$") 
    return match && match.length > 0; 
} 

此外,请注意,这个答案是非常相似 Select link by text (exact match)

和二级注...trim仅在前后删除空白搜索文本。它不会删除单词中间的空格。我相信这是可取的行为,但如果你愿意,你可以改变。

+0

好的答案!帮助了我很多! – Roman 2018-01-25 12:41:14

2

像T.J. Crowder在上面说过,过滤功能确实有奇效。在我的具体情况下,它不适合我。我需要在div内搜索多个表和它们各自的td标签(在本例中为jQuery对话框)。

$("#MyJqueryDialog table tr td").filter(function() { 
    // The following implies that there is some text inside the td tag. 
    if ($.trim($(this).text()) == "Hello World!") { 
     // Perform specific task. 
    } 
}); 

我希望这对某人有帮助!

0

我发现了一种适用于我的方法。它不是100%确切的,但它消除了所有包含的字符串不仅仅包含我正在查找的单词,因为我检查了不包含单独空格的字符串。顺便说一下,你不需要这些“”。 jQuery知道你正在寻找一个字符串。确保在:contains()部分只有一个空格,否则它将不起作用。

<p>hello</p> 
<p>hello world</p> 
$('p:contains(hello):not(:contains())').css('font-weight', 'bold'); 

是的,我知道你有没有这样的东西<p>helloworld</p>