Слишком много рекурсии - PullRequest
2 голосов
/ 21 мая 2011

Я использую JS в Firefox 4 и получаю «слишком большую ошибку рекурсии» для следующего кода:

  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 ]

3 голосов
/ 21 мая 2011

Я думаю, что эта строка:

        var children = currentObj.childNodes;

должно быть:

        var children = domObj.childNodes;

Мне кажется, что ваша ссылка на "currentObj" начинается сверху, а не с рассматриваемого элемента. Конечно, трудно сказать, потому что вы не включили соответствующее определение или инициализацию "currentObj".

0 голосов
/ 21 мая 2011

Вы также можете попробовать итеративный подход вместо рекурсии:

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 массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...