2012-02-02 107 views
1

我正在通過html作爲字符串。我的目標是從具有所有適當節點的html中創建一個新文檔,以便我可以在我創建的文檔上執行諸如調用doc.getElementsByTagName之類的操作,並使其按預期工作。我的代碼的一個例子就是在這裏。使用document.implementation.createDocument創建一個新的HTML文檔

var doc = window.document.implementation.createDocument 
    ('http://www.w3.org/1999/xhtml', 'html', null); 
doc.getElementsByTagName('html')[0].innerHTML = 
     '<head><script>somejs</script>' + 
     '<script>var x = 5; var y = 2; var foo = x + y;</script>' + 
     '</head><body></body>'; 
var scripts = doc.getElementsByTagName('script'); 
console.log(scripts[0] + " code = " + scripts[0].innerHTML); 

我有以下問題:

  1. 如果一個腳本標籤中的內容,包含上述「無功富= X + Y」;在例如像<一個字符(例如陳述變化我得到一個INVALID_STATE_ERR:DOM異常11.
  2. 即使腳本標記內沒有使用這樣的字符,當我運行上面的時候,我得到輸出「[object Element] code = undefined」

所以我的問題是:

A.如何處理字符,如<,給DOM異常11,當我嘗試使用他們不管我是誰設置innerHTML來 B.如何使文檔正確解析腳本標記並將其代碼放入其innerHTML屬性中,以便稍後可以閱讀它。

編輯:正如Ryan P指出,這段代碼實際上在FF中工作。因此,如果任何人都可以幫助我在鉻合金工作,將不勝感激!

回答

0

答:您需要將任何<轉換爲HTML實體(& lt;)。規則不會停止適用,因爲您在腳本標記中。你可以調用你的變量'doc',但是嘗試從一個未定義的變量'tempDoc'中獲取腳本標籤。當我在更改該變量後在瀏覽器中運行代碼時,它似乎都可以正常工作。

+0

感謝您的回覆! tempDoc vs doc是我把代碼放入堆棧溢出的錯誤。我原本有兩個功能。 Interstingly,閱讀你的迴應後,我嘗試在FF中運行我的代碼,它的工作原理,但它不適用於鉻。任何想法爲什麼這可能是?你能證實這種行爲嗎?還有一個標準的正則表達式用於將所有必要的字符轉換爲它們的HTML實體equivilents? – asutherland 2012-02-02 19:33:28

+0

是的,我正在使用FF。檢入Chrome並且innerHTML無效,但textContent適用於Chrome和FF。不知道IE。 – 2012-02-02 19:42:15

+0

非常感謝!標記爲答案。 – asutherland 2012-02-02 19:45:28

4

https://github.com/rails/turbolinks採取 你爲什麼不嘗試創建該文件是這樣的:

doc = document.implementation.createHTMLDocument(""); 
doc.open("replace"); 
doc.write(html); 
doc.close(); 

其中html應該是你的HTML內容。 我沒有測試過它,不知道你是否應該先轉義角色。

+0

我已經證實這個工作(雖然我不認爲空的「」是必要的)。 – 2013-08-05 14:18:19

+0

「」會告訴文檔不要加載在HTML中指定的請求,例如圖像,腳本等......換句話說,「」不會在內部加載HTTP請求,否則,如果沒有指定它,它會,甚至運行JS ..你可能不希望這樣,所以引號應該是非常必要的。 – joseeight 2013-09-09 19:45:40