WindowProxy和Window对象?

Zed*_*Zed 14 javascript html5

有人可以解释为什么WindowProxy对象存在吗?我明白真正的Window对象通过这个对象做了一切,但无法理解目的.

jtr*_*ick 12

此构造适用于支持html5浏览上下文模型.本质上,每个脚本可以具有其主要活动窗口的集中访问点,以在功能上分离各个内部窗口内的瞬态引用,文档历史记录,缓存以及以依赖于上下文的方式跟踪每个脚本的需要.

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

windowProxy在这里引用外部的

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

windowProxy在这里引用顶级'Window'.

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


Dom*_*nic 6

考虑以下代码:

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);
  };
};
Run Code Online (Sandbox Code Playgroud)

事实证明这是真的。而且,许多网站都依赖于这一点:它们在导航之前获取对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。在我们的示例中,它委托给导航之前的Windowfor/a和导航之后的Windowfor 。/b