Opera中的跨域iframe通信

时间:2010-02-12 00:58:26

标签: cross-domain opera

我需要在同一个域的两个iframe之间进行通信,这两个iframe位于我无法控制的其他域的父页面内。

这是一个Facebook应用程序,基本布局是这个

apps.facebook.com/myapp
       L iframe1(src ='mysite.com / foo')
       L iframe2(src ='mysite.com / bar')

我需要frame1与frame2通信,但在Opera中我无法访问window.parent.frames ['frame2'] 执行通常的跨域方法(例如更新location.hash)

在Opera中是否有另一种方法可以实现这一目标?

感谢您的提前帮助

3 个答案:

答案 0 :(得分:2)

您是否尝试使用HTML5 web messaging。目前最近版本的浏览器都很好地支持它。

iframe.contentWindow.postMessage('Your message','http://mysite.com');

postMessage属性需要来源http://mysite.com

答案 1 :(得分:1)

一般没有。同源策略拒绝向上向父母进行通信的可能性,然后必须向下向下移动到另一帧。在任何浏览器中都是如此。

如果父文档已经为您的待定框架提供了唯一的name,那么通过让用户点击href="otherurl#message" target="name"的链接,可以进行有限的通信形式,只要URL完全匹配,它将通过更改哈希值而不重新加载页面来导航目标帧。在Mozilla中,您也可以使用form target执行此操作,允许您编写其提交脚本(因为链接点击不能自动化),但不能在Opera中编写。可能用得不多......不知道FB在任何情况下都会给你一个帧目标name

您可以使用cookie(*)在同一域中的脚本之间建立通信通道:一个脚本编写会话cookie,另一个脚本轮询更改document.cookie以查找其中的消息。但它非常丑陋并且需要一些烦人的工作来控制信号,当有多个文档同时打开时,这些信息是针对谁的。第三方框架中的cookie还有其他限制(您可能需要编写P3P策略以使IE合作)。

(*:或者,大概是HTML5网络存储空间,如果可用的话。)

答案 2 :(得分:1)

正如其他人所说,使用window.postMessage。但是,不要使用window.parent.frames['frame2'],请尝试window.parent.frames[x],其中 x 是另一个iframe的节点列表中的位置。

您可以在此处查看跨源的示例:http://webinista.s3.amazonaws.com/postmessage