在 JavaScript 中,<iframe>
我需要在父窗口中调用一个函数。两个窗口都来自同一个域。
使用安全window.parent.myFunction();
吗?
在 JavaScript 中,<iframe>
我需要在父窗口中调用一个函数。两个窗口都来自同一个域。
使用安全window.parent.myFunction();
吗?
是的,您可以window.parent
在同一个域中使用。
WhatWG规范第 6 章:加载网页说:
iframe.parent
存在iframe.parent
是iframe
的父级 DOM 的代理我试图通过阅读规范向您展示如何得出这个结论,同时牢记:从内部访问的特征是什么?parent
iframe
开始吧。这是一篇长文。
parent
WhatWG#dom-parent说window.parent
:
浏览上下文b
Window
中 a 的对象的 parent IDL 属性必须返回父浏览上下文的对象,如果有的话(即如果b是子浏览上下文),或者浏览上下文b的对象本身,否则(即,如果它是顶级浏览上下文或分离的嵌套浏览上下文)。Document
WindowProxy
WindowProxy
parent
是访问类似于父窗口的 DOM 的属性。然而:
WindowProxy
?让我们继续阅读。
浏览上下文是Document
向用户呈现对象的环境。
Web 浏览器中的选项卡或窗口通常包含浏览上下文,就像框架集中的 iframe 或框架一样。每个浏览上下文都有一个对应的 WindowProxy 对象。
窗口代理是代理window
对象并实施例如安全约束的对象。对于一个window
对象,可以有多个代理(例如iframes
,来自两个不同域的两个代理访问同一个父级)。
WindowProxy 对象允许脚本就像每个浏览上下文都有一个 Window 对象一样,同时仍然为每个 Document 保留单独的 Window 对象。
我们就快到了。继续阅读。
如果以下条件之一为真,则允许浏览上下文 A 导航第二个浏览上下文 B:
- A 的活动文档的来源与 B 的活动文档的来源相同,或者
- 浏览上下文 A 是一个嵌套的具有顶级浏览上下文的浏览上下文,它的顶级浏览上下文是 B,或者
- 浏览上下文 B 是辅助浏览上下文,并且允许 A 导航 B 的开启者浏览上下文,或
- 浏览上下文 B 不是顶级浏览上下文,但存在 B 的祖先浏览上下文,其活动文档与 A 的活动文档具有相同的来源(实际上可能是 A 本身)。
如果两者都来自同一个域,可以从它的iframe
访问函数吗?parent
让我们推断。
parent
不是window
父对象,而是一个WindowProxy
.iframe
访问其父级,因为它们都具有相同的来源(参见上面的第一个安全条件)。您会看到:如果您仔细阅读规范,您可以找到浏览器应该如何运行的答案。阅读规范是一项后天的技能。它需要耐心和准确。
然而:世界没有那么美好。有些浏览器没有按照它们应该的那样实现规范。买者自负。