XPath / Javascript - INVALID_STATE_ERR при создании дерева новых узлов - PullRequest
1 голос
/ 05 ноября 2011

В настоящее время я играю с JS и встроенным XPath.Я пытаюсь создать небольшой тестовый скрипт и обнаружил интересную ошибку, которую хотел бы понять.Я вызываю функцию оценки следующим образом:

var result = document.evaluate(
    xpath,
    document,
    null,
    XPathResult.ANY_TYPE);

В этом случае я получаю смешанные результаты.Строковые, логические и числовые типы не являются проблемой для обработки, но UNORDERED_NODE_ITERATOR_TYPE несколько сложен.

Моя функция для обработки результата выглядит так:

    function nodes(iterator, parentNode) {
        var cur = iterator.iterateNext(); // do not touch! altering this object causes a INVALID_STATE_ERR Exception
        var myObj = cur == null || cur == undefined ? undefined : cur.cloneNode(true);
        var count = 0;

        while(myObj) {
            parentNode.appendChild(myObj);
            var =  iterator.iterateNext().cloneNode(true);
        }
    }

Но когда я пытаюсь запуститьэта функция я получаю исключение INVALID_STATE_ERR.Но почему?Я клонирую объекты, и мой родительский узел - это новый созданный элементный узел.(document.createElement ('body'), который должен заменить исходный узел body в конце.

Нужно ли создавать элемент new-body другим способом? Это исключение выброшено, потому что новый элемент bodyприкреплен к текущему дереву документа? Как я могу это сделать, если я не могу использовать createElement?

1 Ответ

1 голос
/ 06 ноября 2011

Я попытался создать контрольный пример для воспроизведения проблемы, http://jsfiddle.net/pe95g/2/. Он отлично работает с Mozilla и Opera, но не работает с браузерами WebKit, такими как Chrome и Safari. На мой взгляд, он не должен завершаться сбоем, так как запрашиваемый документ DOM не изменяется, только узлы, не присоединенные к этому документу, создаются и изменяются во время итерации XPath. С другой стороны, примечание XPath для W3C DOM уровня 3 не очень точно в отношении того, что такое «модификация документа», которая «делает итерацию недействительной».

В качестве обходного пути я попытался использовать моментальный снимок вместо итератора с XPath API DOM Level 3, http://jsfiddle.net/WT5Uk/1/,, который подходит для меня, когда все четыре основных настольных браузера поддерживают document.evaluate (то есть Mozilla, Опера, Сафари, Хром). Так что это единственный обходной путь, который я могу предложить.

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