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 に答える