Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何替换窗口中的文档?_Javascript_Dom_Document - Fatal编程技术网

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
);