有人可以解释为什么WindowProxy对象存在吗?我明白真正的Window对象通过这个对象做了一切,但无法理解目的.
jtr*_*ick 12
此构造适用于支持html5浏览上下文模型.本质上,每个脚本可以具有其主要活动窗口的集中访问点,以在功能上分离各个内部窗口内的瞬态引用,文档历史记录,缓存以及以依赖于上下文的方式跟踪每个脚本的需要.
下面的两张图片说明了这个概念:

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

在上图中,顶级窗口由每个内部窗口和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);
};
};
Run Code Online (Sandbox Code Playgroud)
事实证明这是真的。而且,许多网站都依赖于这一点:它们在导航之前获取对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。在我们的示例中,它委托给导航之前的Windowfor/a和导航之后的Windowfor 。/b
| 归档时间: |
|
| 查看次数: |
2680 次 |
| 最近记录: |