60

この質問では、特定のノードの下にあるすべてのテキストノードを見つける必要がありました。私はこのようにこれを行うことができます:

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;
      })
    );
  }
}

ただし、XPathを使用すると、単純にクエリを実行して実行できるという事実を考慮すると、これはエレガントではないように思われます.//text()

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

「最もシンプル」とは、「ゴルフをせずに効率的で短い」と大まかに定義されています。

4

2 に答える 2

165

@kennebecの回答に基づいて、同じロジックの少し厳密な実装:

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;
}
于 2012-05-24T03:32:34.033 に答える
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;
}
于 2012-05-24T02:31:11.033 に答える