在xul中设置innerHTML

时间:2011-08-14 12:53:34

标签: firefox-addon xul

我在我的browser.xul代码中,我所追求的是从html文件中获取数据并将其插入到我的div元素中。
我正在尝试使用div.innerHTML,但我得到一个例外:

  

组件返回失败代码:0x804e03f7   [nsIDOMNSHTMLElement.innerHTML]

我尝试使用Components.interfaces.nsIScriptableUnescapeHTML解析HTML并将解析后的html附加到我的div中但我的问题是样式(属性和标记)和脚本没有被解析。

2 个答案:

答案 0 :(得分:2)

首先警告:如果您的HTML数据来自网络,那么您正试图在扩展程序中构建安全漏洞。不应该信任来自网络的HTML代码(即使是来自您自己的网络服务器和通过HTTPS),您应该真正使用nsIScriptableUnescapeHTML。样式应该是您的扩展的一部分,使用Web上的样式是不安全的。有关详细信息: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>元素并在那里显示您的数据。您可以从HTML数据中生成data:网址:

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

答案 1 :(得分:0)

XML文档没有innerHTMLnsIScriptableUnescapeHTML是解析html的一种方法,但它是为HTML可能不安全的用途而设计的;你已经发现它会抛弃脚本节点(以及其他一些东西)。

然而,有几种选择。您可以使用responseXML属性,但这可能不是最理想的,除非您收到XHTML内容。

您也可以使用iframe。它可能看起来很老套,但iframe的工作是获取一个url(src属性)并呈现它收到的内容,这必然意味着解析它并构建一个DOM。通常,当以chrome运行的扩展程序执行此操作时,必须注意不要为远程内容提供相同的chrome特权。幸运的是,这很容易管理;只需将type="content"放在iframe上即可。但是,由于您希望将DOM导入到批发的XUL文档中,因此您必须已经确保此远程内容始终是安全的。您显然正在使用HTTPS连接,并且您已经特别注意通过确保它发送正确的证书来验证服务器的身份。您还验证了服务器未被黑客攻击且未提供恶意内容。