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