Jquery 根据元素内容的精确匹配来选择元素
好的,我想知道是否有办法让Jquery 根据元素内容的精确匹配来选择元素,jquery,jquery-selectors,Jquery,Jquery Selectors,好的,我想知道是否有办法让:contains()jQuery的选择器选择只包含键入的字符串的元素 例如- <p>hello</p> <p>hello world</p> $('p:contains("hello")').css('font-weight', 'bold'); 你好 你好,世界 $('p:contains(“hello”)).css('font-weight','bold'); 选择器将选择两个p元素并将其加粗,但我希望它只选择
:contains()
jQuery的选择器选择只包含键入的字符串的元素
例如-<p>hello</p>
<p>hello world</p>
$('p:contains("hello")').css('font-weight', 'bold');
你好
你好,世界
$('p:contains(“hello”)).css('font-weight','bold');
选择器将选择两个p
元素并将其加粗,但我希望它只选择第一个。否,没有jQuery(或CSS)选择器可以这样做
您可以随时使用:
它不是选择器,但它完成了任务。:-)
如果要处理“hello”之前或之后的空白,可以在其中添加:
return $.trim($(this).text()) === "hello";
对于那些不成熟的优化器,如果您不在乎它与hello
和类似的内容不匹配,您可以通过直接使用innerHTML
避免调用$
和text
:
return this.innerHTML === "hello";
…但你必须有大量的段落才能让它起作用,很多段落可能会先有其他问题。:-) 您可以使用jQuery的函数来实现这一点
$("p").filter(function() {
// Matches exact string
return $(this).text() === "Hello World";
}).css("font-weight", "bold");
.first()在这里会有所帮助
$('p:contains("hello")').first().css('font-weight', 'bold');
尝试添加扩展伪函数:
$.expr[':'].textEquals = $.expr.createPseudo(function(arg) {
return function( elem ) {
return $(elem).text().match("^" + arg + "$");
};
});
然后你可以做:
$('p:textEquals("Hello World")');
所以阿曼杜的答案大部分是有效的。然而,在野外使用它时,我遇到了一些问题,我本希望找到的东西却没有找到。这是因为有时元素的文本周围会出现随机空白。我相信,如果您正在搜索“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;
}
另外,请注意,这个答案与
第二个注意<代码>修剪仅删除搜索文本前后的空白。它不会删除单词中间的空格。我相信这是一种理想的行为,但是如果你愿意,你可以改变它。就像上面提到的T.J.Crowder一样,过滤功能确实很神奇。在我的特殊情况下,它对我不起作用。我需要在一个div中搜索多个表及其各自的td标记(在本例中是jQuery对话框)
我希望这对某人有帮助 我找到了一种适合我的方法。它不是100%精确的,但它消除了所有包含不只是我要查找的单词的字符串,因为我也检查了不包含单个空格的字符串。顺便说一句,你不需要这些。jQuery知道您正在寻找字符串。确保:contains()部分中只有一个空格,否则它将无法工作
<p>hello</p>
<p>hello world</p>
$('p:contains(hello):not(:contains( ))').css('font-weight', 'bold');
你好
你好,世界
$('p:contains(hello):not(:contains())).css('font-weight','bold');
是的,我知道如果你有像helloworld这样的东西,它是不起作用的,一个与jQuery一起工作的一行程序:
$('p').filter((i, p) => $(p).text().trim() === "hello").css('font-weight', 'bold');
这相当于jQuery的a:contains(“模式”)
选择器:
var res = $('a').filter((i, a) => $(a).text().match(/pattern/));
嗯,您可以用自己的代码覆盖
:contains
选择器,但我不认为这是您的意思。您可以定义一个自定义选择器:的可能重复项:的可能重复项也可能希望$。在进行比较之前,修剪它的任何多余空格。出于某种原因,我不得不使用“==”要让它代替“===”@Stephan:如果你在与一个数字进行比较,你必须使用==
(==2
)或者将数字放在一个字符串中(==“2”
),因为你从text()
或innerHTML
获得的值总是一个字符串。如果要与字符串进行比较,那么使用=
还是==
都无关紧要。jQuery实现了:contains
,这有点复杂,但没有实现精确文本匹配的选择器,这让人感到遗憾={当然……在这个特定的例子中。如果在开发时不知道顺序怎么办?很好的解决方案:很少添加:为了确保不覆盖现有的expr,我会这样做:$.expr[':'].textEquals=$.expr[':'].textEquals | |$.expr.createPseudo(function(arg){
我对jquery很陌生,但我认为使用每一个()而不是filter(),因为filter的目标是返回一个子数组。但这确实激发了解决方案的灵感,因为我也有同样的问题:)巧妙地使用包含(..)的简单匹配,而不使用过滤器或扩展!不适用于任何需要在第一个包含(..)中使用空格的内容,但尝试为此找到一个解决方案。谢谢!
$('p').filter((i, p) => $(p).text().trim() === "hello").css('font-weight', 'bold');
var res = $('a').filter((i, a) => $(a).text().match(/pattern/));