我在firefox 4上使用JS并获得以下代码的“太多递归错误”:
extractText: function(domObj) {
if (domObj == null) {
return "";
} else {
var acc = "";
if (domObj.nodeType == Node.TEXT_NODE) {
acc += domObj.nodeValue;
}
if (domObj.hasChildNodes()) {
var children = currentObj.childNodes;
for (var i = 0; i < children.length; i++) {
acc += sui.extractText(children[i]);
}
}
return acc;
}
}
};
任何?
答案 0 :(得分:3)
我认为这一行:
var children = currentObj.childNodes;
应该是:
var children = domObj.childNodes;
在我看来,你对“currentObj”的引用是从顶部开始,而不是从正在检查的元素下降。当然很难说,因为你没有包含“currentObj”的相关定义或初始化。
答案 1 :(得分:0)
您也可以尝试迭代方法而不是递归:
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("");
}
此算法使用堆栈为仍必须访问的节点实现depth first search。如果它是Node instance,则堆栈中的第一项是domObj
。然后对于堆栈上的每个节点:如果它是Text node,则将其值添加到文本片段数组tf
;如果它是Element node,则其子节点以相反的顺序放在堆栈上,以便第一个子节点位于堆栈顶部。重复这些步骤直到堆栈为空。最后,使用数组的tf
方法将join
中的文本片段放在一起。