16

有人可以解释为什么真正存在 WindowProxy 对象吗?我了解真正的 Window 对象通过该对象完成所有操作,但无法理解其目的。

4

2 回答 2

12

此构造用于支持 html5 浏览上下文模型。本质上,每个脚本都可以为其主要活动窗口提供一个集中的访问点,以在功能上解耦各个内部窗口、文档历史记录、缓存中的瞬态引用,以及以与上下文相关的方式跟踪每个脚本的需要。

下面的两张图片说明了这个概念:

windowProxy 在这里指的是外部的“浏览器窗口”。

在上图中,浏览器窗口由每个内部窗口内容中的 windowProxy 引用作为别名。

windowProxy 在这里指的是顶层的“窗口”。

在上图中,顶级Window由每个内部窗口和 iframe 内容中的 windowProxy 引用别名。

于 2013-10-05T04:42:11.823 回答
2

考虑以下代码:

const iframe = document.appendChild(document.createElement("iframe"));

iframe.src = "/a";
iframe.onload = () => {
  const windowA = iframe.contentWindow;

  iframe.src = "/b";
  iframe.onload = () => {
    const windowB = iframe.contentWindow;
    
    console.log("window before navigation === window after navigation?", windowA === windowB);
  };
};

事实证明,这是真的。而且,许多网站都依赖于这一点:它们在导航之前获取对 的引用iframe.contentWindow,或者可能是。window.frames[0]然后他们在导航后继续使用它。

(请注意,在我们的示例中,我们通过执行 启动导航iframe.src = "/b"。所以理论上我们当时可能知道获取对 的新引用iframe.contentWindow。但在一般情况下,导航可以在不涉及外框的情况下发生,例如用户可以点击 iframe 中的链接,或者 iframe 中的代码可以这样做location.href = "/c"。)

这怎么可能是真的?毕竟,我们导航到了一个完全不同的页面——它将有一个新的Window(具有新的全局范围,不受前一页声明的任何全局变量的污染)、一个新Document的等。

这是真的,因为WindowProxyiframe.contentWindow, 或window.frames[0], 或任何其他尝试访问窗口的方式,返回一个WindowProxy对象,而不是一个Window对象。该WindowProxy对象委托给当前的任何Window内容。在我们的示例中,它代表导航前的 for 和Window导航后的for 。/aWindow/b

于 2021-05-07T14:58:58.423 回答