2011-12-31 76 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 节点。

相关问题