当父级不在同一个域中时,在iframe中关闭iframe

时间:2011-12-20 11:12:11

标签: javascript html iframe facebook-like facebook-canvas

我有一个Facebook画布应用程序作为顶级设置栏。我添加了一个类似按钮,打开一个IFrame,其中包含喜欢该应用程序的用户,可以选择喜欢/不同于应用程序。我在iframe中添加了一个按钮,该按钮假设在点击时关闭该iframe。

所以在iframe html里面我有:

function closeIFrame() {
    window.parent.closeLikeIframe();
}

我创建的按钮执行此功能。

在父页面内我有以下代码:

function closeLikeIframe() {
    var iframe = document.getElementById('likeIframe');
    iframe.style.display = "none";
}

所以在Firefox中它运行得很好,但在其他浏览器中却没有。我可以javascript错误

unsafe JavaScript attempt to access frame with URL http://X from frame with URL http://Y. Domains, protocols and ports must match.
user_like.html:15Uncaught TypeError: Property 'closeLikeIframe' of object [object DOMWindow] is not a function

它找不到函数closeLikeIframe,因为主页面位于facebook上,而IFrame本身就位于我的服务器上,所以我不允许访问。

有关如何正确打开和关闭IFrame的任何想法?

感谢

1 个答案:

答案 0 :(得分:1)

有一个通用的解决方法,有点hacky,并涉及将另一个iframe放在第一个:

+------------------------------------------------+
| A: Main page on FB                             |
|                                                |
|    +---------------------------------------+   |
|    | B: Iframe (page on your server)       |   |
|    |                                       |   |
|    |    +--------------------------------+ |   |
|    |    | C: Another iframe, page on FB  | |   |
|    |    |                                | |   |
|    |    +--------------------------------+ |   |
|    +---------------------------------------+   |
+------------------------------------------------+

A和C可以通信,因为它们来自同一个域。

C只包含一个小脚本,用于侦听URL参数并调用A中的方法。

B使用适当的URL参数设置C的src属性。

编辑:This post使用真实的图表和所有内容解释得更好!