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

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

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

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
26
0
3 399
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Попробуй это:

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 завершен.

Это не работает, если ответ изначально не является допустимым XML. Если вы скажете Firefox ожидать XML, он будет строго придерживаться того, что он будет анализировать.

thelsdj 07.06.2010 03:07

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

document.createElement( 'div' );

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

The innerHTML property takes a string that specifies a valid combination of text and elements. When the innerHTML property is set, the given string completely replaces the existing content of the object. If the string contains HTML tags, the string is parsed and formatted as it is placed into the document.

Проблема в том, что мне нужен весь HTML-документ,

and all which this would throw away. Also I'm trying to not use existing windows / tabs because my code runs outside the context of them and I want to be resistant to a user randomly closing a window or tab making my code get interrupted (assuming Firefox is still running).
thelsdj 07.06.2010 03:08

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

Да, я использую расширение Firefox, но в большинстве примеров iframe используется произвольное окно браузера, а не объект в основном процессе, чтобы быть устойчивым к закрытию браузера / вкладок.

thelsdj 07.06.2010 03:08
Ответ принят как подходящий

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

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

Is there any option besides using the hidden iframe trick?

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

And if not, what is the best way to do the iframe trick so that your code works outside the context of any currently open tabs (so that closing tabs won't screw up code, etc)?

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

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

Другие вопросы по теме