Как анализировать HTML из JavaScript в Firefox?

Каков наилучший способ проанализировать (получить дерево DOM) HTML-результат XmlHttpRequest в Firefox?

ИЗМЕНИТЬ:

У меня нет дерева DOM, я хочу его приобрести.

XmlHttpRequest "responseXML" работает только тогда, когда результат является фактическим XML, поэтому у меня есть только responseText для работы.

innerHTML hack, похоже, не работает с полным HTML-документом (в <html> </html> ). - получается, что он отлично работает.

Ответ 1

innerHTML должен работать нормально, например

// This would be after the Ajax request:
var myHTML = XHR.responseText;
var tempDiv = document.createElement('div');
tempDiv.innerHTML = myHTML.replace(/<script(.|\s)*?\/script>/g, '');

// tempDiv now has a DOM structure:
tempDiv.childNodes;
tempDiv.getElementsByTagName('a'); // etc. etc.

Ответ 2

По крайней мере, для более новых версий Firefox более простой способ или скоро будет доступен.

https://developer.mozilla.org/en/HTML_in_XMLHttpRequest указывает, что, начиная с FF11, можно будет запросить DOM непосредственно из XHR, установив атрибут responseType до "document". В этот момент HTML будет проанализирован, а DOM застрял в responseXML как для XML-документа.

Ответ 3

Завершите свойство responseXML объекта XMLHttpRequest. Кроме того, если вы используете innerHTML для добавления responseText отформатированного HTML-ответа, браузер будет анализировать текст и собирать его внутри DOM, прежде чем даже добавить его в поток документов.

Ответ 4

Если ваши данные XHTML, так что это действительный XML, то DOMParser (Mozilla) или loadXML (IE) могут помочь. Если нет, я не могу придумать ничего лучше, чем снять и затем передать его в innerHtml.

См. 21.1.3 в Руководстве по работе с Фланаганом (5-е издание).

Колин

Ответ 5

Вы можете использовать DOMParser для анализа HTML - даже суп-суп:

var parser = new DOMParser()
parser.parseFromString('<!DOCTYPE html><html><head><title>hi</title></head><body><p>hello<b>world</b></p>', 'text/html')

Я не знаю, хорошо ли он обрабатывает разметку частичной таблицы, но он должен создать тот же самый DOM, который сам браузер делает для почти любой разметки.