установка innerHTML в xul - PullRequest
       1

установка innerHTML в xul

0 голосов
/ 14 августа 2011

У меня в коде browser.xul есть кое-что, что я связываю для извлечения данных из html-файла и вставки их в мой элемент div.
Я пытаюсь использовать div.innerHTML, но получаю исключение:

Компонент возвратил код ошибки: 0x804e03f7 [NsIDOMNSHTMLElement.innerHTML]

Я пытался проанализировать HTML-код с помощью Components.interfaces.nsIScriptableUnescapeHTML и добавить проанализированный html в мой div, но моя проблема в том, что стиль (атрибут и тег) и скрипт не анализируются.

Ответы [ 2 ]

2 голосов
/ 15 августа 2011

Сначала предупреждение: если ваши HTML-данные поступают из Интернета, вы пытаетесь создать дыру в безопасности вашего расширения.HTML-код из Интернета никогда не следует доверять (даже если он поступает с вашего собственного веб-сервера и через HTTPS), и вам действительно следует использовать nsIScriptableUnescapeHTML.Стили должны быть частью вашего расширения, использование стилей из Интернета небезопасно.Для получения дополнительной информации: https://developer.mozilla.org/En/Displaying_web_content_in_an_extension_without_security_issues

Что касается вашей проблемы, этот код ошибки - NS_ERROR_HTMLPARSER_STOPPARSING, который, по-видимому, означает ошибку синтаксического анализа.Я предполагаю, что вы пытаетесь кормить его обычным HTML-кодом, а не XHTML (который будет XML-совместимым).В любом случае, лучший способ синтаксического анализа кода XHTML будет DOMParser, это дает вам документ, который вы можете затем вставить в нужное место.

Если точка действительно анализироватьHTML-код (не XHTML), тогда у вас есть два варианта.Один использует элемент <iframe> и отображает там ваши данные.Вы можете сгенерировать URL data: из ваших данных HTML:

 frame.src = "data:text/html;charset=utf-8," + encodeURIComponent(htmlData);

Если вы не хотите отображать данные во фрейме, вам все равно понадобится фрейм (может быть скрыт), который имеет HTMLдокумент загружен (может быть about:blank).Затем вы используете Range.createContextualFragment() для анализа вашей HTML-строки:

var range = frame.contentDocument.createRange();
range.selectNode(frame.contentDocument.documentElement);
var fragment = range.createContextualFragment(htmlData);
0 голосов
/ 14 августа 2011

XML-документы не имеют innerHTML, а nsIScriptableUnescapeHTML - это один из способов анализа html, но он предназначен для случаев, когда HTML может быть небезопасным; как вы узнали, он отбрасывает узлы сценария (и некоторые другие вещи).

Однако есть несколько альтернатив. Вы можете использовать свойство responseXML, хотя это может быть неоптимальным, если вы не получаете контент XHTML.

Вы также можете использовать iframe. Это может показаться старомодным, но работа iframe состоит в том, чтобы взять url (свойство src) и обработать получаемый контент, что обязательно означает его разбор и построение DOM. В общем случае, когда расширение, работающее под управлением Chrome, делает это, ему следует позаботиться о том, чтобы удаленному контенту не предоставлялись те же привилегии chrome. К счастью, с этим легко справиться; просто поместите type="content" на iframe. Однако, поскольку вы хотите импортировать DOM в документ XUL оптом, вы, должно быть, уже убедились, что этот удаленный контент всегда будет в безопасности. Вы, очевидно, используете соединение HTTPS, и вы позаботились о том, чтобы проверить подлинность сервера, убедившись, что он отправляет правильный сертификат. Вы также убедились, что сервер не был взломан и не доставляет вредоносный контент.

...