Как я могу превратить строку HTML в объект DOM в расширении Firefox?

Я загружаю веб-страницу (HTML тегов) с XMLHttpRequest, и я хочу получить результат и превратить его в объект DOM, на котором я затем могу запускать запросы XPATH. Как преобразовать строку в объект DOM?

Похоже, что общее решение - создать скрытый iframe и бросить в него содержимое строки. Ходили разговоры об обновлении DOMParser для поддержки text / html, но начиная с Firefox 3.0.1 вы все равно получаете сообщение, NS_ERROR_NOT_IMPLEMENTED если попытаетесь.

Есть ли какой-нибудь вариант, кроме использования трюка со скрытым iframe? А если нет, то как лучше всего использовать трюк с iframe, чтобы ваш код работал вне контекста любых открытых в данный момент вкладок (чтобы закрытие вкладок не испортило код и т. Д.)?

Это пример того, почему я ищу решение, отличное от взлома iframe. Если мне нужно написать весь этот код, чтобы получить надежное решение, я бы предпочел искать что-то еще.

Ответов (5)

Решение

Сегодня у Ajaxian был пост о вставке / извлечении html из iframe . Вероятно, вы можете использовать фрагмент js, который они там разместили.

Что касается обработки закрытия браузера / вкладки, вы можете присоединиться к событию onbeforeunload ( http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx ) и делать все, что вам нужно. .

Try this:

var request = new XMLHttpRequest();

request.overrideMimeType( 'text/xml' );
request.onreadystatechange = process;
request.open ( 'GET', url );
request.send( null );

function process() { 
    if ( request.readyState == 4 && request.status == 200 ) {
        var xml = request.responseXML;
    }
}

Notice the overrideMimeType and responseXML.
The readyState == 4 is 'completed'.

Попробуйте создать div

document.createElement( 'div' );

А затем установите HTML-тег супа на внутренний HTML-код div. Браузер должен преобразовать это в XML, который затем можно будет проанализировать.

Свойство innerHTML принимает строку, определяющую допустимую комбинацию текста и элементов. Когда установлено свойство innerHTML, данная строка полностью заменяет существующее содержимое объекта. Если строка содержит теги HTML, строка анализируется и форматируется по мере помещения в документ.

Итак, вы хотите загрузить веб-страницу как объект XML с помощью javascript, но не хотите использовать веб-страницу? Поскольку у вас нет контроля над тем, что будет делать пользователь (закрытие вкладок, окон или чего-то еще), вам нужно будет сделать это как виджет OSX Dashboard или какое-то отдельное приложение. Расширение Firefox также будет работать, если вам не нужно беспокоиться о том, что пользователь закроет браузер.

Есть ли какой-нибудь вариант, кроме использования трюка со скрытым iframe?

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

А если нет, то как лучше всего использовать трюк с iframe, чтобы ваш код работал вне контекста любых открытых в данный момент вкладок (чтобы закрытие вкладок не испортило код и т. Д.)?

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

Вам нужно окно DOM для правильной работы iframe, поэтому на данный момент нет чистого решения (если вы заинтересованы в использовании парсера Mozilla).