我在我的browser.xul代碼中,我打算從html文件中獲取數據並將其插入到div元素中。
我試圖使用div.innerHTML,但我得到一個異常:
在xul中設置innerHTML
組件返回故障代碼:0x804e03f7 [nsIDOMNSHTMLElement.innerHTML]
我試圖解析使用組件的HTML .interfaces.nsIScriptableUnescapeHTML並將解析後的html附加到我的div中,但我的問題是樣式(屬性和標記)和腳本沒有解析。
我在我的browser.xul代碼中,我打算從html文件中獲取數據並將其插入到div元素中。
我試圖使用div.innerHTML,但我得到一個異常:
在xul中設置innerHTML
組件返回故障代碼:0x804e03f7 [nsIDOMNSHTMLElement.innerHTML]
我試圖解析使用組件的HTML .interfaces.nsIScriptableUnescapeHTML並將解析後的html附加到我的div中,但我的問題是樣式(屬性和標記)和腳本沒有解析。
首先警告:如果您的HTML數據來自網絡,那麼您正試圖在您的擴展中構建安全漏洞。來自網絡的HTML代碼永遠不會被信任(即使來自您自己的Web服務器和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),那麼您有兩個選擇。一種是使用元素並在那裏顯示數據。您可以從您的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);
XML文檔沒有innerHTML
和nsIScriptableUnescapeHTML
是獲取解析的html的一種方法,但是它被設計用於HTML可能不安全的情況;正如你發現它拋棄了腳本節點(以及其他一些事情)。
但是有幾個選擇。您可以使用responseXML
屬性,但這可能不是最理想的,除非您收到XHTML內容。
您也可以使用iframe。它可能看起來過時了,但iframe的工作是獲取url(src
屬性)並呈現它接收的內容,這必然意味着解析它並構建DOM。一般來說,當一個以chrome運行的擴展程序執行此操作時,它將不得不注意不要給遠程內容提供相同的chrome privilages。幸運的是,這很容易管理;只需在iframe上放置type="content"
即可。但是,由於您希望將DOM導入到您的XUL文檔批發中,因此您必須確保此遠程內容始終安全。您明顯使用HTTPS連接,並且通過確保發送正確的證書來驗證服務器的身份。您還已驗證服務器未被黑客入侵併且未提供惡意內容。
XML文檔確實有'innerHTML',但它的設計採取兼容的XML數據。 –
我的主要問題是使用iframe,因爲它在panel中有一些iframe問題。關於使用iframe解析數據的第二個選項,您建議在html:div中設置解析數據的位置,它可能是不安全的。 – Yosi
如果安全問題(數據不是來自您的擴展或用戶,而是來自某個Web服務器),那麼您不應該首先使用這種HTML解析。它確實是'
數據來自我的擴展(html文件)。使用iframe有問題(面板和iframe作爲子問題),nsIScriptableUnescapeHTML也有問題,因爲它刪除了樣式和腳本。 – Yosi