select文本链接(完全匹配)

使用jQuery,我想select一个链接,其中包含确切的某种文本。 例如:

<p><a>This One</a></p> <p><a>"This One?"</a></p> <p><a>Unlikely</a></p> 

我试过这个:

 $('a:contains("This One")') 

但它select第一个和第二个链接。 我只想要第一个包含“This One”的链接。 我怎样才能做到这一点?

你可以这样做:

 $('a').filter(function(index) { return $(this).text() === "This One"; }); 

参考: http : //api.jquery.com/filter/

我的一个同事使用一个函数来扩展jQuery:

 $.expr[':'].textEquals = function(a, i, m) { return $(a).text().match("^" + m[3] + "$"); }; 

结果是你可以通过这种方式select确切的文字:

 $("label:textEquals('Exact Text to Match')"); 

这很容易,因为你不必每次都记住确切的语法。 他的整个职位是在这里: jQuery自定义select器,以精确的文本select元素:textEquals

展开FishBasketGordo的答案。 如果您尝试在大量元素上进行select,请使用:contains()首先缩小范围,然后应用filter。

这将提高整体速度:

 $('a:contains("This One")').filter(function(index) { return $(this).text() === "This One"; }); 

不得不修改Nariman的解决scheme是:

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

否则在chrome(Linux)上不工作

我正在使用扩展名

 $.expr[':'].textEquals 

但是我发现这个实现不再适用于jQuery 1.7(显然是Sizzla.filter的改变)。 经过一段时间的努力使其工作,我只是写了一个jQuery插件来完成相同的。

 $.fn.textEquals = function (text) { var match = false; $(this).each(function () { if ($(this).text().match("^" + escapeRegex(text) + "$")) { match = true; return false; } }); return match; }; 

使用:

 $(".ui-autocomplete li").textEquals('Exact Text to Match'); 

只是想分享,以防其他人碰到这个(,

如何从drop-dwon获取选定的值:

 $.fn.textEquals = function (text) { var match = false; var values=""; $(this).each(function () { if ($(this).text().match("^" + text + "$")) { values=$(this).val(); match = true; return false; } }); return values; }; 

console.log($("option").textEquals("Option One")); – 它会返回下拉的值

所以纳尼安的答案工作得很好。 然而,在野外使用它,我遇到了一些问题,我预计会发现的东西没有find。 这是因为有时元素的文本周围会有随机的空白。 我相信,如果你正在寻找“Hello World”,你仍然希望它匹配“Hello World”,甚至是“Hello World \ n”。 因此,我只是将“trim()”方法添加到该函数中,这会删除周围的空白,并且开始工作得更好。 另外,我修改了variables名,使之更加清晰。

特别…

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

而辅助笔记…修剪仅删除search到的文本前后的空格。 它不会删除单词中间的空格。 我相信这是可取的行为,但如果你愿意,你可以改变。

 var link = $('a').filter(function(index) { return $(this).text() === "Availability"; }); $(link).hide(); $(link).removeAttr('href'); 

对不起,如果这与上面任何人的答案完全一致,

  $.fn.equalsText = function (text, isCaseSensitive) { return $(this).filter(function () { if (isCaseSensitive) { return $(this).text() === text } else { return $(this).text().toLowerCase() === text.toLowerCase() } }) } 

以下是LinkedInsearch结果页面控制台中的一些输出。

 $("li").equalsText("Next >", false) [<li class=​"next">​…​</li>​] // Output $("li").equalsText("next >", false) [<li class=​"next">​…​</li>​] // Output $("li").equalsText("Next >", true) [<li class=​"next">​…​</li>​] // Output $("li").equalsText("next >", true) [] // Output 

它也具有区分大小写的支持,并没有使用:contains()

编辑(2017年5月22日): –

  $.fn.equalsText = function (textOrRegex, isCaseSensitive) { return $(this).filter(function () { var val = $(this).text() || this.nodeValue if (textOrRegex instanceof RegExp) { return textOrRegex.test(val) } else if (isCaseSensitive) { return val === textOrRegex } else { return val.toLowerCase() === textOrRegex.toLowerCase() } }) } 
 $('a:contains("This One")')[0]; 

我觉得我错过了基于其他人的filter的答案,但为什么不只是select“contains”返回的元素数组中的第一个项目?

这是有效的,只有当你知道第一个链接有你正在寻找完全匹配。 其他答案更好地工作,如果你不确定链接将在哪个顺序。