仅选择直接包含文本的元素

时间:2013-08-06 18:53:50

标签: jquery

所以我有这样的事情:

<div class="main">
  <div class="useless">
    text I don't want.    
  </div>
  <div class="useless">
    text I don't want.    
  </div>
  <div class="narrow">
    text I'm searching for
  </div>
  <div class="useless">
    text I don't want.    
  </div>
  <div class="useless">
    text I don't want.    
  </div>
</div>

使用jQuery的可爱:contains selector,我可以搜索关键字,但它会返回父级和子级。

我希望它只返回直接包含我正在搜索的单词的元素。

Stackoverflow有用地建议this link作为先前的尝试,但它似乎非常笨重,因为它爬行所有dom节点并且需要很多不清楚的代码。

3 个答案:

答案 0 :(得分:8)

此脚本将查找包含特定文本的所有节点。它还允许您对文本(正则表达式等)进行任何字符串测试。

function getNodesThatContain(text) {
    var textNodes = $(document).find(":not(iframe, script, style)")
      .contents().filter( 
          function() {
           return this.nodeType == 3 
             && this.textContent.indexOf(text) > -1;
    });
    return textNodes.parent();
};

console.log(getNodesThatContain("test"));

以下是测试的小提琴:http://jsfiddle.net/85qEh/4/

PS - 为了提高速度,请使用不同的顶级选择器。例如,如果您只需要#container内部,那么您将var textNodes = $('#container')...

答案 1 :(得分:2)

解决方案,在上面提到的另一个问题中提供,但显然是一个不被高度重视的解决方案,是这样做的:

$("div:contains('searching')").filter(function() {
    return (
    $(this).clone() //clone the element
    .children() //select all the children
    .remove() //remove all the children
    .end() //again go back to selected element
    .filter(":contains('searching')").length > 0)
}).css('border', 'solid 1px black');

我添加它比写一个巨大的东西来抓取所有DOM节点更少笨重,并且在狭窄范围内真的应该影响更少的地方。

如果其他人有更好的想法,我肯定会感兴趣。

http://jsfiddle.net/TT7dR/42/

答案 2 :(得分:-2)

在JS中试试这个

$('div >:contains("text Im searching for")')