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

19

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

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

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

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

    
задан thelsdj 06.08.2008 в 21:08
источник

5 ответов

7

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

Что касается обработки закрытия браузера / вкладки, вы можете подключиться к onbeforeunload ( Ссылка ) и сделайте все, что вам нужно.

    
ответ дан Darren Kopp 06.08.2008 в 22:37
4

Попробуйте следующее:

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;
    }
}

Обратите внимание на overrideMimeType и responseXML .
readyState == 4 «завершено».

    
ответ дан Steve Willard 06.08.2008 в 21:13
  • Это не работает, если ответ недействителен для начала XML. Если вы скажете Firefox ожидать XML, он будет строго разбираться в том, что он будет анализировать. –  thelsdj 07.06.2010 в 01:07
1

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

document.createElement( 'div' );

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

  

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

    
ответ дан Steve Willard 06.08.2008 в 21:59
  • Проблема в том, что мне нужен весь HTML-документ, <head> и все, что это выбрасывает. Также я пытаюсь не использовать существующие окна / вкладки, потому что мой код работает за пределами их контекста, и я хочу быть устойчивым к случайному закрытию окна или вкладке, из-за чего мой код прерывается (предполагая, что Firefox все еще работает). –  thelsdj 07.06.2010 в 01:08
1

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

    
ответ дан Steve Willard 06.08.2008 в 22:22
  • Да, я использую расширение Firefox, но большинство примеров iframe используют произвольное окно браузера, а не объект в основном процессе, чтобы быть устойчивым к закрытию браузера / вкладки. –  thelsdj 07.06.2010 в 01:08
1
  

Есть ли опция, кроме использования скрытого трюка iframe?

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

  

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

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

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

    
ответ дан Nickolay 12.08.2008 в 20:56