1

getElementsByTagName("*")将为您提供Depth First Search in Pre-order. 问题是,如果我在节点的 HTML 中搜索一个字符串,则无法判断它是否在另一个将由getElementsByTagName("*"). 那么,有没有办法将节点从叶子迭代到根?很可能一个DFS-Post order会做的伎俩!

例如:

  <div id=""master">
    <div id="id1">
      <div id="id2">
        <span>text</span><i>more text</i>
      </div>
    </div>
  </div>

如果我们正在搜索<i>more text</i>,那么结果的第一个元素的 innerHTML 以及所有后续元素都将匹配。但我只想要确切的孩子来匹配字符串。如果我们是从树叶开始的,那么我们可以break在找到文字后离开。

还有什么想法吗?

4

2 回答 2

1

如果您必须实际执行此文本搜索,请确保nodeType === 3然后检查nodeValue字符串。您实际要返回的节点是parentNode所述节点的。

不过,我认为总的来说这是一个坏主意,如果您希望所述元素的内容发生变化(这就是您搜索它的原因),请附加一个事件处理程序来监听变化。

于 2013-07-12T20:28:35.273 回答
0

这比您名义上的需要略多,但正是您想要的。

它允许您使用基于属性的多个条件搜索节点,并提供所有匹配项的数组。

function getNodes(prop, needle, blnMatch, node){
    var results=[], any=(needle==null); 
      node=node||document.documentElement;
      if(node.splice){ node={childNodes:node}; }
    for(var it, i=0, kids=node.childNodes;it=kids[i];i++){
        if(it.childNodes.length){
            results=results.concat(getNodes(prop, needle, blnMatch, it));
        }
        switch(true){
            case    any && it[prop]:
            case    it[prop]===needle:  
            case blnMatch && !!String(it[prop]).match(needle):
             results[results.length]=it; 
        }
    }
   return results;
}//end getNodes()


//for your purpose, you can use it to reach the actual textNode as such:

var node=getNodes("data","more text")[0];
alert([node.data, node.nodeName]) // shows : "more text, #text"

请注意,您可以通过更多方式使用它来获取特定属性:

getNodes("nodeType", 3);
getNodes("nodeValue", "more text");
getNodes("nodeName", /^(a|link)$/i, true);
于 2013-07-12T20:27:17.863 回答