Trouver tous les nœuds de texte en page HTML

Duplication possible:
GetElementsByTagName () équivalent pour textNodes

Pour cette question, je devais trouver tous les nœuds de texte sous un nœud particulier. Je peux le faire comme suit:

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

Cependant, cela semble inelegant compte tenu du fait qu'avec XPath on pourrait simplement demander pour .//text() et être fait avec lui.

Quel est le moyen le plus simple d'obtenir tous les nœuds de texte sous un élément particulier dans un document HTML, qui fonctionne sur IE9 +, Safari5 +, Chrome19 +, Firefox12 +, Opera11 +?

«Simplest» est défini comme étant «efficace et court, sans golf».

Sur la base de la réponse de @ kennebec, une mise en œuvre légèrement plus stricte de la même logique:

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

Cependant, beaucoup plus vite, plus serré et plus élégant utilise createTreeWalker pour que le navigateur filtre tout sauf les nœuds de texte pour vous:

 function textNodesUnder(el){ var n, a=[], walk=document.createTreeWalker(el,NodeFilter.SHOW_TEXT,null,false); while(n=walk.nextNode()) a.push(n); return a; } 
 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; }