Как я могу превратить строку 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 (msdn) и делать все, что вам нужно.
Попробуй это:
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, он будет строг в отношении того, что он будет анализировать.
Попробуйте создать div
document.createElement( 'div' );
А затем установите HTML-тег супа на внутренний HTML-код div. Браузер должен преобразовать это в XML, который затем можно проанализировать.
Свойство InnerHTML принимает строку, задающую допустимую комбинацию текста и элементов. Когда свойство InnerHTML установлено, данная строка полностью заменяет существующее содержимое объекта. Если строка содержит теги HTML, она анализируется и форматируется при помещении в документ.
Проблема в том, что мне нужен весь HTML-документ, <head> и все, что при этом будет выброшено. Кроме того, я пытаюсь не использовать существующие окна/вкладки, потому что мой код выполняется вне их контекста, и я хочу быть устойчивым к тому, чтобы пользователь случайно закрывал окно или вкладку, что приводило к прерыванию моего кода (при условии, что Firefox все еще работает).
Итак, вы хотите загрузить веб-страницу как объект XML с помощью JavaScript, но не хотите использовать веб-страницу? Поскольку у вас нет контроля над тем, что будет делать пользователь (закрытие вкладок, окон и т. д.), вам нужно будет сделать это как виджет панели управления OSX или какое-то отдельное приложение. Расширение Firefox также будет работать, если только вам не придется беспокоиться о том, что пользователь закроет браузер.
Да, я использую расширение Firefox, но в большинстве примеров iframe используется произвольное окно браузера, а не объект в основном процессе, чтобы обеспечить устойчивость к закрытию браузера/вкладки.
Есть ли какой-либо вариант, кроме использования скрытого трюка iframe?
К сожалению, нет, не сейчас. В противном случае вместо него будет использоваться код микросводки, на который вы указываете.
А если нет, то как лучше всего проделать трюк с iframe, чтобы ваш код работал вне контекста любых открытых в данный момент вкладок (чтобы закрытие вкладок не испортило код и т. д.)?
Код, который вы процитировали, использует последнее окно браузера, поэтому закрытие вкладок не повлияет на анализ. Закрытие этого окна браузера прервет загрузку, но вы можете справиться с этим (например, обнаружить, что загрузка прервана, и перезапустить ее в другом окне), и это происходит не очень часто.
Для правильной работы iframe вам нужно окно DOM, поэтому на данный момент нет чистого решения (если вы заинтересованы в использовании парсера Mozilla).
Вызов функции ASP . NET из JavaScript?
Я пишу веб-страницу в ASP . NET. У меня есть код JavaScript, и у меня есть кнопка отправки с событием клика. Можно ли вызвать метод, который я создал в ASP, с помощью события click JavaScript? Вы должны использовать некоторую библиотеку Ajax, например: Anthem 20 ответов Что ж, если вы не хотите делать это с помощью Ajax или каким-либо другим способом и просто хотите, чтобы происходила обычная обратная передача ASP . NET, вот как вы это делаете (без использования каких-либо других библиотек): Хотя это немного сложно... :) i. В вашем файле кода (при условии, что вы используете C# и .NET 2.0 или более позднюю версию) добавьте следующий интерфейс к вашему классу Page, чтобы он выглядел как public partial class Default : System.Web.UI.Page, IPostBackEventHandler{} ii. Это должно добавить (используя Tab-Tab) эту функцию в ваш файл кода: public void RaisePostBackEvent(string eventArgument) { } iii. В событии onclick в JavaScript напишите…
Инструменты устранения неполадок JavaScript в Internet Explorer
Инструменты устранения неполадок JavaScript в Internet Explorer Я интенсивно использую Firebug и консоль Mozilla JS, но время от времени я сталкиваюсь с ошибкой JavaScript только для IE, которую действительно трудно найти (например, ошибка в строке 724, когда исходный HTML-код содержит всего 200 строк). Я хотел бы иметь легкий JS-инструмент (а-ля firebug) для Internet Explorer, что-то, что я могу установить за считанные секунды на ПК клиента, если я столкнусь с ошибкой, а затем удалю. Некоторые инструменты Microsoft требуют значительного времени для загрузки и настройки. Есть идеи? Рассматривали ли вы Firebug Lite? Есть отладчик скриптов…
MAC-адреса в JavaScript Я знаю, что мы можем получить MAC-адрес пользователя через IE (объекты ActiveX). Есть ли способ получить MAC-адрес пользователя с помощью JavaScript? 8 ответов Я согласен со всеми предыдущими ответами, что это будет уязвимость конфиденциальности/безопасности, если вы сможете сделать это непосредственно из Javascript. Я могу думать о двух вещах: Использование Java (с подписанным апплетом) Использование подписанного Javascript, который в FF…