jQuery:选择包含任何文本的第一个锚点

Posted

技术标签:

【中文标题】jQuery:选择包含任何文本的第一个锚点【英文标题】:jQuery: select first anchor that contains any text 【发布时间】:2013-07-14 08:36:56 【问题描述】:

考虑以下标记:

<a href="#"></a>
<a href="#"><img src="foo.png" /></a>
<a href="#">aaa</a>
<a href="#">bbb</a>

是否可以使用 jQuery 选择器来获取包含任何文本的第一个锚点(但如果它仅包含图像则不能)? (在这种情况下,aaa 一个)

【问题讨论】:

&lt;a href="#"&gt;foo&lt;b&gt;bar&lt;/b&gt;&lt;/a&gt;&lt;a href="#"&gt;&lt;b&gt;bar&lt;/b&gt;&lt;/a&gt; 怎么样? 这两种情况都应该定位。 【参考方案1】:

jQuery 没有懒惰的first 选择器,所以在过滤它们之前你仍然会匹配所有的锚标签:

$('a').filter(function() 
    return $(this).text();
).first()

【讨论】:

我想可以在找到第一个匹配项后通过首先检查 isFound 布尔值来停止过滤功能,这将提高效率。 @exizt: filter() 将在数组中的每个元素上调用。除非您使用像 $.each 这样的循环,否则您无法真正停止它,但是如果您首先使用的是 jQuery,那么微优化就没有意义了。 嗯,是的,但是如果我们先检查isFound,它不会调用每个人的text() 方法。尽管这种优化是否会带来显着的性能优势确实值得怀疑。【参考方案2】:

这个复杂的选择器首先检查元素没有任何子元素,然后确保元素不为空。

var anchor = $("a:not(:has(img)):not(:empty)").eq(0);

工作示例 http://jsfiddle.net/dZLKE/3/

【讨论】:

是的,这个得到了图像。 空荡荡的孩子呢? @Blender 不会 :not(:empty) 报道吗? @Kobi 一切都很好,你让我进行了额外的测试。双赢场景 就性能而言,像这样的复杂选择器并不是最好的解决方案。我在这里将其与我的答案进行比较:jsperf.com/complex-vs-simple【参考方案3】:
var txtEl;
$('a').each(function(i, el)
  var text = $(el).text();
  if(text != "")
     txtEl = el;
     return false;
  
);

Jquery Selector

【讨论】:

【参考方案4】:
$('a').each(function()
    if($.trim($(this).text()) != '')
       alert($(this).text());
    
);

现场演示:http://jsfiddle.net/AGKeY/2/

【讨论】:

String.prototype.trim() 在 IE8 及更低版本中不可用。请改用$.trim()【参考方案5】:

这将返回容器中带有文本的第一个锚点,而不是遍历所有元素。

var getFirstAnchorWithText = function (container) 

    var anchor = null;

    container.find('a').each(function () 
        if ($(this).text()) 
            anchor = $(this);
            return false; // Exits from the loop as soon as the element is found
        
    );

    return anchor;


演示小提琴here.

【讨论】:

以上是关于jQuery:选择包含任何文本的第一个锚点的主要内容,如果未能解决你的问题,请参考以下文章

Jquery,在具有相同类的所有锚点之后选择第一个下一个元素

在锚点上触发 jQuery 的 hover() 以显示包含 LI 的下拉菜单?

jQuery 选择器:获取包含特定单词的第一个元素类的内容

禁用文本框后 JQuery UI 自动完成功能不起作用

Firefox 锚点内的输入框中没有文本选择

jQuery load() 帮助