jQuery 文本属性选择器

Posted

技术标签:

【中文标题】jQuery 文本属性选择器【英文标题】:jQuery text attribute selector 【发布时间】:2011-03-04 21:38:48 【问题描述】:

我正在尝试将 text 属性用作选择器,但我无法完全掌握这种行为,如果有人能解释一下,我将不胜感激。例如给定<span class="span_class"><a class="a_class">text</a></span>$('a.a_class').text() 按预期给出“文本”。然而$('a.a_class[text]') 不会匹配任何元素,$('span.span_class > a.a_class[text]') 也不会匹配,但$('span.span_class* > a.a_class[text]') 会匹配(尽管不在 IE 中)。 对于 IE,我能想到的唯一解决方法是遍历跨度中包含的所有锚点,在每个锚点上使用 .text() 并将其与特定条件匹配,但它似乎比使用内置选择器慢。谁有更好的主意?

【问题讨论】:

【参考方案1】:

如何使用自定义选择器

$(document).ready(function()
  $.extend($.expr[':'], 
    notext: function(elem, i, attr)
      return( $(elem).text() === "" );
    
  );        
);

概要

$('span:notext').remove();

您甚至可能想要创建一个处理正则表达式的选择器,例如

$.extend($.expr[':'], 
   'content': function(elem, i, attr)      
     return( RegExp(attr[3]).test($(elem).text()) );
   
);

概要

$('span:content(^api_)').remove();

将选择并删除所有文本以 api_ 开头的跨度

【讨论】:

我会在这里留下同样的评论:除非你需要一个正则表达式,否则使用.indexOf(),它快得多,当你'正在谈论选择器,尤其是在潜在的大量元素上,速度很重要。 完美,正是我想要的:)。谢谢。 是的,我也将其调整为使用 indexOf。谢谢大家的帮助。 使用$.text(elem) 代替$(elem).text() 可能更好——前者更快,因为它避免了构建新的jQ 实例。 @J-P - $.text() 对数组进行操作,它实际上是 $.text([this]),但在性能方面很好 :)【参考方案2】:

这是因为在这种情况下“文本”不是属性。它是元素的内容。

您正在寻找:contains() 选择器:

$('a.a_class:contains(text)');

http://api.jquery.com/contains-selector/

请记住,此选择器将匹配字符串的任何部分。 contains(foo) 也将匹配“foo bar”。

如果你想精确匹配整个文本字符串,你可以使用filter()

$('a.a_class').filter(function() 
    return $(this).text() == "text";
);

编辑:

要查找内容以某个值开头的元素,您可以在filter() 中使用正则表达式:

$('a.a_class').filter(function() 
    return $(this).text().indexOf( "tex" ) >= 0;
);

编辑:更新为使用indexOf(),而不是@Nick 推荐的正则表达式。

【讨论】:

嗯好的。我一直在寻找的是“Starts with”,而$('span.span_class* > a.a_class[text^="tex"]') 工作得很好,直到我用 IE 对其进行了测试。 @Shagglez - 我根本没有意识到这会起作用。我想我会使用带有正则表达式的filter() 选项来确定文本是否以“tex”开头。 @Shagglez - 您可以使用@patrick 所拥有的功能,只需将return $(this).text() == "text"; 替换为return $(this).text().indexOf("text") ===0; 即可进行“开始”检查。 除非你需要一个正则表达式,否则使用.indexOf(),它快得多,当你谈论选择器时,尤其是在潜在的大量元素,速度很重要。

以上是关于jQuery 文本属性选择器的主要内容,如果未能解决你的问题,请参考以下文章

CSS-属性&&选择器

是否有跨浏览器的方式在 expando 属性上使用 jQuery 选择器?

Jquery 选择器:属性值以开头和结尾

jQuery 高级选择器

jquery 选中文本框 jquery 文本框样式 jquery 改变样式

jquery选择器之表单选择表单对象属性