我正在尝试使用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()并将其与特定条件匹配,但它似乎比使用内置选择器慢。谁有更好的想法?
答案 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_