有人可以解释为什么真正存在 WindowProxy 对象吗?我了解真正的 Window 对象通过该对象完成所有操作,但无法理解其目的。
2 回答
此构造用于支持 html5 浏览上下文模型。本质上,每个脚本都可以为其主要活动窗口提供一个集中的访问点,以在功能上解耦各个内部窗口、文档历史记录、缓存中的瞬态引用,以及以与上下文相关的方式跟踪每个脚本的需要。
下面的两张图片说明了这个概念:
在上图中,浏览器窗口由每个内部窗口内容中的 windowProxy 引用作为别名。
在上图中,顶级Window由每个内部窗口和 iframe 内容中的 windowProxy 引用别名。
考虑以下代码:
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
的等。
这是真的,因为WindowProxy
。iframe.contentWindow
, 或window.frames[0]
, 或任何其他尝试访问窗口的方式,返回一个WindowProxy
对象,而不是一个Window
对象。该WindowProxy
对象委托给当前的任何Window
内容。在我们的示例中,它代表导航前的 for 和Window
导航后的for 。/a
Window
/b