【问题标题】:How do you replace the document in a window?如何替换窗口中的文档?
【发布时间】:2012-01-31 03:45:06
【问题描述】:
var newDoc = document.implementation.createHTMLDocument('someTitle');
// swap newDoc with document

DOMImplementation.createHTMLDocument

  • 是否可以将当前文档换成新文档?
  • 是否有任何合理的理由这样做?

【问题讨论】:

  • 你可能不能。 window.document 本身是只读的,window 上没有方法可以更改其链接的 document。但是,我找不到任何来源来证明我的假设是正确的。
  • 我也是这么想的,但可能有一些东西在那里。我的意思是,如果您不能将新文档注入窗口,那么创建新文档的意义何在。也许您可以将其注入新窗口/ iframe
  • 是的,您可以将其注入 iframe,即 createHTMLDocument 的 MDN's example更新:虽然不是直接。但您可以使用 importNode 和 @ 987654329@)。它还可以用于解析从 http 请求获得的 HTML(然后有一个 DOM 表示)。
  • @Raynos 我之前在 PHP 聊天室中与您交谈过。希望你做得很好。谢谢之前的建议。你是个很酷的家伙。
  • @copy a document 和 documentElement 是完全不同的。 (尝试Document.prototype.isPrototypeOf(document.documentElement 这是错误的)

标签: javascript dom document


【解决方案1】:

document 中有一些与它包含的 DOM 树没有真正关系的东西, 如document.cookielocationURL。如果我们不能替换像windowdocument 这样的全局对象,那就更安全了。

但是,您可以通过将主要的documentdocumentElement 替换为另一个documentdocumentElement 来有效地实现您的目标。 它会产生与您正在寻找的完全相同的效果。*

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

至于这样做的原因,我目前发现one是iframe无法实现的。

* 请注意,如果文档类型不同,则必须替换主文档的文档类型 节点与另一个文档的 doctype 节点分开。

【讨论】:

    【解决方案2】:

    如果您将文档序列化为 HTML,您可以将当前页面的文档替换为 document.opendocument.writedocument.close

    事实上,您甚至可以通过添加<!doctype html> 将 Quirks 模式更改为标准模式。

    例如: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

    【讨论】:

    • 这不是很有趣,因为您必须使用 HTML 字符串。我对使用 Document 元素更感兴趣
    • 当提到原始问题时,它确实允许您替换文档。如果这不是您在 DOMImplementation.createHTMLDocument 声明的上下文中寻找的内容,这是可以理解的
    【解决方案3】:

    您不能将当前文档对象或任何文档对象替换为使用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多