Javascript 如何替换窗口中的文档?
Javascript 如何替换窗口中的文档?,javascript,dom,document,Javascript,Dom,Document,是否可以将当前文档交换为新文档 有什么合理的理由这样做吗 您不能将当前文档对象或任何文档对象替换为使用createHTMLDocument方法创建的document对象 createHTMLDocument最初是在domlevel2core的一个草案中引入的,但后来从最终建议中删除 它后来被添加到HTML5规范中,因为没有编程方式来创建HTML文档 为HTML文档的编程创建提供的一些用例包括: 创建一个未呈现的HTML文档,通过XMLHttpRequest(而不是 发送XML文档) 在库代码中
- 是否可以将当前文档交换为新文档
- 有什么合理的理由这样做吗
createHTMLDocument
方法创建的document
对象
createHTMLDocument
最初是在domlevel2core
的一个草案中引入的,但后来从最终建议中删除
它后来被添加到HTML5规范中,因为没有编程方式来创建HTML文档
为HTML文档的编程创建提供的一些用例包括:
- 创建一个未呈现的HTML文档,通过XMLHttpRequest(而不是 发送XML文档)
- 在库代码中以保证 避免对显示的文档产生副作用
- 从富文本编辑区域创建一个独立的未呈现文档,以便 客户端清理可以在上传之前完成,而不会干扰实时系统 用户仍可以进一步编辑的DOM
- 在JavaScript客户端实现HTML5解析算法,以进行测试和 用于比较目的,或用于虚拟化或基于对象功能的安全性 不可见的iframe可以用于这些目的中的大多数,但这更重要 在资源方面很昂贵。
W3C邮件列表上的对话将该方法带回到规范中,如果将文档序列化为HTML,则可以将当前页面的文档替换为
文档。打开,文档。编写和文档。关闭
事实上,您甚至可以通过添加
将Quirks模式更改为标准模式
例如:
警报(“现在处于兼容模式”+document.compatMode);
if(document.compatMode==='BackCompat'){
setTimeout(函数(){
var标记='新页面';
document.open();
文件。编写(标记);
document.close();
}, 0);
}
我不建议在没有特例场景的情况下使用它,但它确实有效
来源:+在文档中有一些东西与它所包含的DOM树并不相关,
例如document.cookie
,location
和URL
。如果我们不能替换像window
和document
这样的全局对象,那么会更安全
但是,通过将主文档
的文档元素
替换为另一个文档
可以有效地实现您要查找的内容。
它将有完全相同的效果,你正在寻找*
<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>
至于这样做的原因,到目前为止,我发现使用iframe无法实现这一点
*请注意,如果doctype不同,则必须替换主文档的doctype
节点与其他文档的doctype节点分开。您可能不能<代码>窗口。文档
本身是只读的,窗口
上没有方法更改其链接的文档
。然而,我找不到任何来源来证明我的假设是正确的。我也这么认为,但可能有什么原因。我的意思是,如果不能将新文档插入窗口,那么创建新文档有什么意义呢。也许你可以将它注入一个新窗口/iframe是的,你可以将它注入一个iframe,这是createHTMLDocument(更新:但不是直接更新。但是你可以使用importNode
和replaceChild(importedDocumentElement,document.documentElement)
)。它还可以用来解析从http请求中得到的HTML(然后用DOM表示)。希望你做得很好。谢谢你之前的建议。你真是个酷家伙。@复制文档和documentElement完全不同。(请尝试Document.prototype.isPrototypeOf(Document.documentElement
为false)这不是很有趣,因为你必须使用HTML字符串。我更感兴趣的是使用文档元素当提到原始问题时,它确实允许你替换文档。如果这不是你在doImplementation.createHTMLDocument
stateme的上下文中要找的,这是可以理解的新界
<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>
document.replaceChild(
document.importNode(newdoc.documentElement, true),
document.documentElement
);