Вы также можете попробовать итеративный подход вместо рекурсии:
extractText: function(domObj) {
if (!(domObj instanceof Node)) return null;
var stack = [domObj], node, tf = [];
while (stack.length > 0) {
node = stack.pop();
switch (node.nodeType) {
case Node.TEXT_NODE:
tf.push(node.nodeValue);
break;
case Node.ELEMENT_NODE:
for (var i=node.childNodes.length-1; i>=0; i--)
stack.push(node.childNodes[i]);
break;
}
}
return tf.join("");
}
Этот алгоритм реализует поиск в глубину , используя стек для узлов, которые все еще должны быть посещены. Первый элемент в стеке - domObj
, если это Узел экземпляр . Затем для каждого узла в стеке: если это Текст узел , его значение добавляется в массив фрагментов текста tf
; если это узел Элемент , его дочерние узлы помещаются в стек в обратном порядке, так что первый дочерний элемент находится сверху стека. Эти шаги повторяются до тех пор, пока стек не станет пустым. В конце текстовые фрагменты в tf
объединяются с использованием метода join
массива.