Javascript WindowProxy和窗口对象?
有人能解释为什么真正存在WindowProxy对象吗?我知道real Window对象通过这个对象做所有的事情,但我不理解它的用途。这个构造是为了支持html5浏览上下文模型。本质上,每个脚本都可以为其主活动窗口提供一个集中的访问点,以便在功能上解耦各个内部窗口中的瞬态引用、文档历史记录、缓存以及以上下文相关方式跟踪每个脚本的需要 以下两幅图说明了这一概念: 在上图中,浏览器窗口由每个内部窗口内容中的windowProxy引用产生别名 在上图中,顶级窗口在每个内部窗口和iframe内容中都被windowProxy引用混淆Javascript WindowProxy和窗口对象?,javascript,html,Javascript,Html,有人能解释为什么真正存在WindowProxy对象吗?我知道real Window对象通过这个对象做所有的事情,但我不理解它的用途。这个构造是为了支持html5浏览上下文模型。本质上,每个脚本都可以为其主活动窗口提供一个集中的访问点,以便在功能上解耦各个内部窗口中的瞬态引用、文档历史记录、缓存以及以上下文相关方式跟踪每个脚本的需要 以下两幅图说明了这一概念: 在上图中,浏览器窗口由每个内部窗口内容中的windowProxy引用产生别名 在上图中,顶级窗口在每个内部窗口和iframe内容中都被
- 考虑以下代码:
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;
log(“导航前的窗口===导航后的窗口?”,windowA==windowB);
};
};
事实证明这是真的。而且,许多网站都依赖于这一点:它们在导航之前获取对iframe.contentWindow
,或者可能是window.frames[0]
的引用。然后他们在导航后继续使用它
(注意,在我们的示例中,我们通过执行iframe.src=“/b”启动了导航。)
。因此,从理论上讲,我们当时可能知道如何获取对iframe.contentWindow
的新引用。但在一般情况下,导航可以在不涉及外部框架的情况下进行,例如,用户可以单击iframe中的链接,或者iframe中的代码可以执行location.href=“/c”
)
这怎么可能是真的?毕竟,我们导航到了一个完全不同的页面——它将有一个新的窗口
(具有一个新的全局范围,没有被上一页声明的任何全局范围所污染),一个新的文档
,等等
这是真的,因为WindowProxy
iframe.contentWindow
,或window.frames[0]
,或尝试访问窗口的任何其他方式,返回WindowProxy
对象,而不是window
对象。该WindowProxy
对象委托给当前窗口的任何对象。在我们的示例中,它在导航之前为/a
委派窗口
,在导航之后为/b
委派窗口