从 iframe 调用父窗口方法(不同)

Posted

技术标签:

【中文标题】从 iframe 调用父窗口方法(不同)【英文标题】:Calling parent window method from Iframe (different) 【发布时间】:2012-10-30 01:36:13 【问题描述】:

我在域上有一个页面:

http://main.mydomain.com/frame.cfm 包含一个 iframe, 加载域http://www.anotherdomain.com。

这个页面http://www.anotherdomain.com有一个脚本引用http://sub.mydomain.com/somescript.js

这个 somescript 是一个类似于 google Analytics 的跟踪脚本,它会随 www.anotherdomain.com 的每个请求一起加载。

在某个阶段,www.anotherdomain.com页面中的脚本http://sub.mydomain.com/somescript.js会尝试调用window.top.aFunction(); or parent.aFunction();

让父窗口做一些事情。

我知道 X-Frame-Options 和 Access-Control-Allow-Origin 标头并尝试了两者,但是当我在 www.anotherdomain.com 上的 iframe 中浏览时,我在 Firebug 中收到一条错误消息,告诉我:

Error: Permission denied to access property 'relocate'window.top.aFunction();

在 main.domain 站点上的 web.config 中,我有以下规则:

<httpProtocol>
     <customHeaders>
    <add name="Access-Control-Allow-Origin" value="http://sub.mydomain.com" />
        <add name="X-Frame-Options" value="ALLOW-FROM http://sub.mydomain.com" />
     </customHeaders>
</httpProtocol>

我认为应该授予 sub.mydomain.com 访问 main.mydomain.com 上的脚本的权限。

我正在我的电脑上本地使用除 www.anotherdomain.com 以外的所有域进行测试,并提供主机参考。

知道我在这里缺少什么吗?

【问题讨论】:

【参考方案1】:

您不能通过跨域 iFrame 访问父窗口函数的方法。它违背了 Same Origin Policy 。 X-Frame http 标头响应告诉浏览器是否允许在 iFrame 中呈现页面,并且对您的情况没有帮助。

我推荐的解决方案是使用window.postMessage() 在两个框架之间进行通信。看http://ejohn.org/blog/cross-window-messaging/

【讨论】:

嗯,好的。看起来有点像解决方法,是吗? Internet Explorer 似乎还不支持它。而且我确实需要支持 IE7+。关于同源策略:我发现我的脚本页面和框架页面位于同一个主域上,这很烦人。在我看来,这应该提供足够的安全性吗?我也可以将脚本放在 main.mydomain.com 域上,但我有一个在那里运行的框架,它将捕获我的单独脚本请求,并且需要一些编码以在框架上下文中忽略此脚本。不是很优雅 谢谢!我还注意到我可以通过 iframe 中的脚本将 parent.location 设置为其他内容。在父级中调用一个函数与直接设置它一样,显然是不同的,安全方面。有点奇怪。此外,如果他们不那么严格,那就太好了;不要着眼于子域,而是着眼于域。以我目前的观点应该足够安全。

以上是关于从 iframe 调用父窗口方法(不同)的主要内容,如果未能解决你的问题,请参考以下文章

在iframe中如何调用父窗体的方法?

从 iframe 调用父窗口函数

父窗口与iFrame之间调用方法和元素

Javascript 子窗口调用父窗口js方法

jqueryjs调用iframe父窗口与子窗口元素的方法整理

jqueryjs调用iframe父窗口与子窗口元素的方法整理