javascript - tablas - Buscar todos los nodos de texto en la página HTML
tablas dinamicas html javascript (2)
Posible duplicado:
getElementsByTagName () equivalente para textNodes
Para esta pregunta , necesitaba encontrar todos los nodos de texto en un nodo en particular. Puedo hacer esto así
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;
})
);
}
}
Sin embargo, esto parece poco elegante a la luz del hecho de que con XPath uno podría simplemente consultar .//text()
y terminar con él.
¿Cuál es la forma más sencilla de obtener todos los nodos de texto bajo un elemento particular en un documento HTML, que funciona en IE9 +, Safari5 +, Chrome19 +, Firefox12 +, Opera11 +?
"Más simple" se define libremente como "eficiente y corto, sin jugar al golf".
Basado en la respuesta de @kennebec, una implementación ligeramente más estricta de la misma lógica:
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;
}
Sin embargo, mucho más rápido, más estricto y más elegante es usar createTreeWalker
para que el navegador filtre todo menos los nodos de texto para usted:
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;
}