2012-05-24 7 views
28

可能な重複をすべてのテキストノードを検索します。私は、特定のノードの下のすべてのテキストノードを見つけるために必要なthis questionについて
getElementsByTagName() equivalent for textNodesHTMLページに

。しかし、これは、XPathと1が単に.//text()を照会可能性があり、それを行うことがあるという事実に照らして洗練思わ

function textNodesUnder(root){ 
    var textNodes = []; 
    addTextNodes(root); 
    [].forEach.call(root.querySelectorAll('*'),addTextNodes); 
    return textNodes; 

    function addTextNodes(el){ 
    textNodes = textNodes.concat(
     [].filter.call(el.childNodes,function(k){ 
     return k.nodeType==Node.TEXT_NODE; 
     }) 
    ); 
    } 
} 

:私ので、同じようにこれを行うことができます。

IE9 +、Safari5 +、Chrome19 +、Firefox12 +、Opera11 +で動作するHTMLドキュメントの特定の要素の下にあるすべてのテキストノードを取得する最も簡単な方法は何ですか?

「最も単純」は、「ゴルフなしで、効率的かつ短期間」とゆるやかに定義されています。 @のケネベックの答え、同じロジックのややタイトな実装に基づいて

+1

http:// st ackoverflow.com/questions/2579666/getelementsbytagname-equivalent-for-textnodes –

+0

Aw、bugger。ありがとう、ジャック、私は検索しましたが、その質問を見つけることができませんでした。 – Phrogz

+0

ええ、サイドバーにも表示されなかった理由はわかりませんが、Google検索を行っている間に見つけました:) –

答えて

89

しかし
function textNodesUnder(node){ 
    var all = []; 
    for (node=node.firstChild;node;node=node.nextSibling){ 
    if (node.nodeType==3) all.push(node); 
    else all = all.concat(textNodesUnder(node)); 
    } 
    return all; 
} 

、はるかに速く、タイト、そしてよりエレガントなので、ブラウザはそのcreateTreeWalkerを使用していますテキストノード以外のすべてを除外します。

function textNodesUnder(el){ 
    var n, a=[], walk=document.createTreeWalker(el,NodeFilter.SHOW_TEXT,null,false); 
    while(n=walk.nextNode()) a.push(n); 
    return a; 
} 
+3

@julmot私のコンピュータで、このページのすべてのテキストノードをChrome v50で検索すると、最初の手法では1900μs、TreeWalker手法では220μsになります。したがって、8または9倍高速です。 – Phrogz

+1

5
function deepText(node){ 
    var A= []; 
    if(node){ 
     node= node.firstChild; 
     while(node!= null){ 
      if(node.nodeType== 3) A[A.length]=node; 
      else A= A.concat(deepText(node)); 
      node= node.nextSibling; 
     } 
    } 
    return A; 
} 
+1

'!= null'を除いた' while(node) 'はどうですか? – Phrogz

+2

また、 'for(node = node.firstChild; node; node = node.nextSibling){...}' – Phrogz

+1

再帰的な解決策がスタック制限の問題になるかもしれないと心配しましたが、 http://stackoverflow.com/questions/7826992/browser-javascript-stack-size-limit)。 – Phrogz