递归太多了

时间:2011-05-21 15:38:18

标签: javascript dom recursion

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

任何?

2 个答案:

答案 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中的文本片段放在一起。