2011-12-31 84 views
5
var newDoc = document.implementation.createHTMLDocument('someTitle'); 
// swap newDoc with document 

DOMImplementation.createHTMLDocument如何在窗口中替換文檔?

  • 是否可以交換當前文檔的一個新的文件?
  • 有沒有合理的理由這樣做?
+0

你可能不能。 'window.document'本身是隻讀的,'window'上沒有方法來改變它的鏈接'document'。然而,我找不到任何資料來證明我的假設。 – copy 2011-12-31 18:58:44

+0

我以爲一樣,但可能有些東西在那裏。我的意思是,如果你不能將它注入到窗口中,那麼創建一個新文檔就意味着什麼。也許你可以注入一個新的窗口/ iframe – Raynos 2011-12-31 19:22:00

+1

是的,你可以注入到一個iframe,這是[MDN的例子](https://developer.mozilla.org/en/DOM/DOMImplementation.createHTMLDocument)createHTMLDocument( __Update__:雖然不是直接的,但是你可以用'importNode'和'replaceChild(importedDocumentElement,document.documentElement)'''來玩。它也可以用來解析你從一個http請求獲得的HTML(然後有一個DOM表示)。 – copy 2011-12-31 19:42:35

回答

5

您不能用createHTMLDocument方法創建的Document對象替換當前文檔對象或任何文檔對象。

createHTMLDocument首次出現在DOM Level 2 Core的其中一個草案中,但後來從最終建議中刪除。

它後來被添加到HTML5規範中,因爲沒有編程方式來創建HTML文檔。

一些規定的程序建立一個HTML文檔的使用情況是,

  • 創建一個非渲染HTML文檔通過XMLHttpRequest(而不是 發送XML文檔)上傳。

  • 功能測試庫代碼中的HTML DOM,保證 避免對顯示的文檔產生副作用。

  • 從富文本編輯區創建一個孤立的非再現的文檔,所以 客戶端清理可以在不擾亂現場 DOM,用戶仍然可以進一步編輯在上傳之前完成。

  • 在JavaScript中實現HTML5客戶端解析算法,用於測試和 比較或虛擬化或基於對象功能的安全性。

    隱形iframe可以用於這些目的中的大多數,但是在資源方面更多的是 。 W3C mailing list

上帶來了方法放回規範W3C郵件列表的談話,[Bug 7842] New: No programmatic way to make an HTML document - consider adding createHTMLDocument

1

如果您序列化到HTML中你可以替換當前頁面的文檔的文檔document.open,document.writedocument.close

實際上,您甚至可以通過添加<!doctype html>將怪癖模式更改爲標準模式。

例如:http://jsbin.com/anusul/2

<html>  
    <script> 
     alert('now in compatMode '+document.compatMode); 
     if (document.compatMode==='BackCompat') { 
      setTimeout(function() { 
     var markup= '<!DOCTYPE html>New Page'; 
       document.open(); 
       document.write(markup); 
       document.close(); 
      }, 0); 
     } 
    </script> 
</html>​​​​​​ 

我不會建議使用它這種掛羊頭賣狗肉沒有特殊的情況,但它確實工作。

來源:Javascript switch from quirksmode to standard + Need help with: jquery prepend doctype to html

+0

這不是很有趣,因爲你必須使用HTML字符串。我更感興趣的是使用Document元素 – Raynos 2012-02-22 02:47:07

+0

當提到原始問題時,它肯定會允許你替換一個文檔,它的理解性如果這不是你在DOMImplementation.createHTMLDocument聲明中尋找的內容 – William 2012-02-22 04:32:30

2

有東西在document那是不是真的涉及到DOM樹包含, 如document.cookielocationURL。如果我們不能替換像windowdocument這樣的全局對象,這會更安全。

但你在找什麼可以通過更換主documentdocumentElement與其他documentdocumentElement有效地實現。 它將擁有正是你正在尋找同樣的效果。*

document.replaceChild(
    document.importNode(newdoc.documentElement, true), 
    document.documentElement 
); 

至於原因,做到這一點,我迄今發現不能用一個iframe來實現one

* 注意,如果文檔類型是不同的,你必須單獨更換與其他文檔的DOCTYPE節點的主文檔的DOCTYPE 節點。

相關問題