jQuery文本属性选择器

时间:2010-06-17 10:32:14

标签: jquery internet-explorer jquery-selectors

我正在尝试使用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唯一的解决方法是循环遍历包含在span中的所有锚点,在每个锚点上使用.text()并将其与特定条件匹配,但它似乎比使用内置选择器慢。谁有更好的想法?

2 个答案:

答案 0 :(得分:3)

这是因为在这种情况下'text'不是属性。这是元素的内容。

您正在寻找: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;
});

编辑:根据@Nick的建议更新为使用indexOf()而非正则表达式。

答案 1 :(得分:3)

使用自定义选择器

怎么样?
$(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_

开头的所有范围