通过其内容的完全匹配选择元素

jul*_*ian 151 jquery jquery-selectors

好吧,我想知道是否有办法让:contains()jQuery的选择器选择只有输入字符串的元素

例如 -

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

$('p:contains("hello")').css('font-weight', 'bold');
Run Code Online (Sandbox Code Playgroud)

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

T.J*_*der 200

不,没有jQuery(或CSS)选择器可以做到这一点.

你可以随时使用filter:

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

它不是一个选择器,但它完成了这项工作.:-)

如果你想在"你好"之前或之后处理空格,你可以$.trim在那里扔一个:

return $.trim($(this).text()) === "hello";
Run Code Online (Sandbox Code Playgroud)

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

return this.innerHTML === "hello";
Run Code Online (Sandbox Code Playgroud)

...但是你必须要有很多段落才能解决这个问题,所以很多你可能先遇到其他问题.:-)

  • 在进行比较之前,可能还想要任何杂散空白的"$ .trim". (7认同)
  • @Stephan:如果你要与一个数字进行比较,你必须使用`==`(`== 2`)或将数字放在一个字符串(`==="2"`)中,因为这个值你从`text()`或`innerHTML`得到的总是一个字符串.如果你要与字符串进行比较,那么使用`==`还是`===`并不重要. (3认同)

Ama*_*Bah 53

尝试添加一个extend伪函数:

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

然后你可以这样做:

$('p:textEquals("Hello World")');
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案:一点点补充:为了确保你不会覆盖现有的expr,我会这样做:```$ .expr [':'].textEquals = $ .expr [':'].textEquals || $ .expr.createPseudo(function(arg){``` (2认同)
  • 这样做更简单一点:`$(elem).text() == arg;`。如果“arg”包含需要转义的字符,效果也会更好。 (2认同)

bwe*_*t87 9

所以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;
}
Run Code Online (Sandbox Code Playgroud)

另外,请注意,此答案与按文本选择链接非常相似 (完全匹配)

次要注释... trim仅删除搜索文本之前和之后的空格.它不会删除单词中间的空格.我相信这是理想的行为,但如果你愿意,你可以改变它.


dsg*_*fin 8

您可以使用jQuery的filter()函数来实现此目的.

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


rf1*_*234 5

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

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

是的,我知道如果你有类似的东西它不会工作 <p>helloworld</p>