Как анализировать 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, который сам браузер делает для почти любой разметки.