按文字选择链接(完全匹配)

End*_*ono 87 jquery jquery-1.6

使用jQuery,我想选择一个包含完全某种文本的链接.例如:

<p><a>This One</a></p>
<p><a>"This One?"</a></p>
<p><a>Unlikely</a></p>
Run Code Online (Sandbox Code Playgroud)

我试过这个:

$('a:contains("This One")')
Run Code Online (Sandbox Code Playgroud)

但它选择了第一个和第二个链接.我只想要第一个链接,其中包含"This One".我怎样才能做到这一点?

Fis*_*rdo 136

你可以这样做:

$('a').filter(function(index) { return $(this).text() === "This One"; });
Run Code Online (Sandbox Code Playgroud)

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

  • 要么在这种情况下工作,但我倾向于使用===,因为它匹配值和类型,即它不会强制类型.http://stackoverflow.com/questions/359494/javascript-vs-does-it-matter-which-equal-operator-i-use (5认同)

Nar*_*ian 38

我的同事扩展了jQuery,其功能是:

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

结果是您可以通过这种方式选择精确的文本:

$("label:textEquals('Exact Text to Match')");
Run Code Online (Sandbox Code Playgroud)

这很容易,因为您不必每次都记住确切的语法.他的全部帖子都在这里: jQuery Custom Selector,用于通过精确文本选择元素:textEquals


小智 27

扩展FishBasketGordo的答案.如果您尝试对大量元素进行选择,:contains()请先使用缩小范围,然后应用过滤器.

这将提高整体速度:

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


Arc*_*her 8

不得不修改Nariman的解决方案:

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

否则无法使用chrome(Linux)


Alv*_*vis 5

我正在使用扩展程序

$.expr[':'].textEquals
Run Code Online (Sandbox Code Playgroud)

但是我发现该实现不再适用于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;
};
Run Code Online (Sandbox Code Playgroud)

使用:

$(".ui-autocomplete li").textEquals('Exact Text to Match');
Run Code Online (Sandbox Code Playgroud)

只是想分享,以防其他人遇到这个问题(,


Mic*_*ili 5

$('a:contains("This One")')[0];
Run Code Online (Sandbox Code Playgroud)

我觉得我遗漏了一些基于其他人对过滤器的答案的东西,但为什么不只选择“包含”返回的元素数组中的第一项呢?

仅当您知道第一个链接与您要查找的完全匹配时,此方法才有效。如果您不确定链接的顺序,其他答案会更好。