Как я могу выбрать узлы из объекта и затем переместить эти узлы в мой документ в Internet Explorer 8+? - PullRequest
0 голосов
/ 30 августа 2011

Чего я хочу добиться:

  • создать объект, выполнив XSL-преобразование (для объекта XML DOM), назовем его «фрагмент»
  • , выбрав некоторые узлызапустив XPATH-запрос к результирующему объекту
  • , соберите эти узлы, скажем, в массив
  • добавьте 'фрагмент' к определенному контейнеру в моем HTML-документе
  • измените любойодин из этих узлов, не путем запроса DOM, а путем ссылки на указанный узел следующим образом: nodeCollection [x]

Моя мотивация:

По сути, это способ «кэширования».«объекты, которые я знаю наверняка, мне придется изменить позже.Поэтому вместо того, чтобы ходить по DOM, чтобы найти их каждый раз, когда они мне нужны, я хочу их «кэшировать».Гораздо быстрее выбирать их с помощью запросов XPATH, и как только я это сделаю, мне больше не нужно выполнять обход DOM, который в моем случае может быть довольно медленным (мы говорим много узлов здесь),Я знаю, что в целом это может показаться очень запутанным решением, но в моей конкретной ситуации оно окупается, по крайней мере, в Firefox (см. Ниже).

Как я это сделал в Firefox:

создать фрагмент документа («xml» и «xsl» являются объектами XML DOM):

xsltProcessor=new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
fragment = xsltProcessor.transformToFragment(xml,document);

XPATH-запрос:

var nodes = document.evaluate("//div", fragment.firstChild, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

собрать узлы в массиве:

nodeCollection = new Array();
i = 0;
node = nodes.iterateNext();
while(node) {
nodeCollection[i] = node;
node = nodes.iterateNext();
i++;
}

добавьте фрагмент к контейнеру в документе HTML:

document.getElementById("container").appendChild(fragment);

измените узел в коллекции:

nodeCollection[0].style.border = '1px solid red';

.. и он будет работать как задумано.

Проблемы, с которыми я столкнулся в Internet Explorer:

Я использовал

var fragmentObject = new ActiveXObject("Msxml2.DOMDocument.3.0");
xml.transformNodeToObject(xsl,fragmentObject);

для создания объекта, для которого я могу выполнять запросы XPATH, например:

var nodes = fragmentObject.selectNodes("//div");

, но после этого шага я не знаю, как добавить «фрагментОбъект» в мой контейнер в документе HTML, а затем выбрать отдельные узлы из «узлов» и манипулировать ими, как я это сделал в Firefox.

То, что я думаю, пошло не так:

'gmentObject '- это Msxml2.DOMDocument.3.0, которыйизначально отличается от фрагмента документа, поэтому я не могу просто переместить узлы из него в мой HTML-документ.Если я пытаюсь что-то вроде

container.appendChild(nodes[1]);

, я получаю эту ошибку: «SCRIPT5022: исключение DOM: HIERARCHY_REQUEST_ERR (3)», что обычно происходит при попытке вставить узел, к которому он не принадлежит (илипо крайней мере, это объяснение, которое я нашел для этой конкретной ошибки).

Может быть, есть какой-то объект, о котором я не знаю, который поддерживает запросы XPATH и могут быть добавлены к документу HTML (?)

Ответы [ 2 ]

0 голосов
/ 06 сентября 2011

если вы добавляете узел, то, как вы сказали, он должен находиться в диапазоне DOM.вроде document.appendChild () выдаст ошибку.Поэтому мы всегда делаем document.body.append. Аналогично, проверяем, может ли этот контейнер напрямую добавлять элемент ..

0 голосов
/ 30 августа 2011

Вместо Msxml2.DOMDocument.3.0 попробуйте Microsoft.XMLDOM

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