如果匹配的文本直接出现在所选元素中,任何元素的后代或其组合中,则jQuery选择器:contains(text)
选择一个元素。
当且仅当匹配的文本直接出现在所选元素中时,我想选择一个元素。我该怎么办?
例如,
<ul>
<li id="1">
<a><img src="la.gif"></a>
happy birthday
<ul><li>radom</li></ul>
</li>
<li id="2">
<a><img src="la.gif"></a>
sad
<ul><li>happy</li></ul>
</li>
</ul>
我想选择包含单词“happy”的li
(如果只有其后代包含单词“happy”,请不要选择li
)。然后只应选择li#1
。
以下操作不符合我的要求,因为它会同时选择li#1
和li#2
:
$('li:contains("happy")');
答案 0 :(得分:3)
修改:从您更新的代码中,我认为您需要使用.contents()
并检查nodeType
以确保它是文本节点,然后将其与你需要的文字。
$('ul li').contents().each( function () {
if (this.nodeType == Node.TEXT_NODE && this.nodeValue.match(/happy/)) {
$(this).closest('li').css('border', '1px solid red');
}
});
或使用.filter()
,
$('ul li').contents().filter( function () {
if (this.nodeType == Node.TEXT_NODE && this.nodeValue.match(/happy/)) {
return true;
}
}).closest('li').css('border', '1px solid red');
让我知道这是否有效..
ul
只应包含li
个标签..如下所示
<ul>
<li id="1">happy</li>
<li id="2">sad <div>happy</div></li>
</ul>
假设你的html是这样的,下面是获取第一个列表的脚本,
$('ul li').filter (function () {
if ($(this).text() == 'happy') return true;
});
.filter
将返回文字“happy”的li
。
答案 1 :(得分:0)
尝试使用.filter()
进行更具体的检查:
alert(
$("ul").filter(function(){return $.trim(this.childNodes[0].nodeValue) === "happy"})[0].id
);
它检查每个nodeValue
的第一个子节点的ul
,看它是否是包含“happy”的文本节点。