10

所以我有这样的事情:

<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选择器,我可以搜索关键字,但它会返回父项和子项。

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

Stackoverflow 有用地建议此链接作为先前的尝试,但它似乎非常笨拙,因为它正在爬取所有 dom 节点并且需要大量不明确的代码。

4

3 回答 3

9

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

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')...

于 2013-08-06T19:39:42.347 回答
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/

于 2013-08-06T19:08:38.493 回答
-2

在 JS 中试试这个

$('div >:contains("text Im searching for")')
于 2013-08-06T19:00:50.350 回答