var newDoc = document.implementation.createHTMLDocument('someTitle');
// swap newDoc with document
DOMImplementation.createHTMLDocument
答案 0 :(得分:5)
您无法使用Document
方法创建的createHTMLDocument
对象替换当前文档对象或任何文档对象。
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 :(得分:2)
document
中的内容与它包含的DOM树并不真正相关,
例如document.cookie
,location
和URL
。如果我们无法替换window
和document
等全局对象,那就更安全了。
但是,您可以通过将document
的主要documentElement
替换为其他document
的{{1}}来有效地实现您所寻求的目标。
它将与您正在寻找的效果完全相同。*
documentElement
至于理由,到目前为止我发现使用iframe无法实现one。
* 请注意,如果doctypes不同,则必须替换主文档的doctype 节点与另一个文档的doctype节点分开。
答案 2 :(得分:1)
如果您将文档序列化为HTML,则可以使用document.open
,document.write
和document.close
替换当前页面的文档。
实际上,您甚至可以通过添加<!doctype html>
来将Quirks模式更改为标准模式。
<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