如何使用jQuery选择直接包含某些指定文本的元素?

时间:2012-03-09 21:45:03

标签: jquery jquery-selectors contains

如果匹配的文本直接出现在所选元素中,任何元素的后代或其组合中,则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#1li#2

$('li:contains("happy")');

2 个答案:

答案 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');

DEMO

让我知道这是否有效..


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

DEMO

答案 1 :(得分:0)

尝试使用.filter()进行更具体的检查:

alert(
    $("ul").filter(function(){return $.trim(this.childNodes[0].nodeValue) === "happy"})[0].id
);​

它检查每个nodeValue的第一个子节点的ul,看它是否是包含“happy”的文本节点。