有没有办法在facebook画布中pushState()父窗口?

时间:2013-02-27 09:54:36

标签: facebook iframe same-origin-policy facebook-canvas pushstate

我希望我的facebook canvas应用程序能够在更改上下文时更新地址栏URL。因此,例如,如果我的应用的主页网址为https://apps.facebook.com/myapp/,并且用户点击主屏幕上的某个项目,我希望地址栏中显示的网址更改为https://apps.facebook.com/myapp/1/或{ {1}}。

通常情况下,我的应用可以使用HTML5 https://apps.facebook.com/myapp/#1来实现。问题是,canvas应用程序在iframe中运行,并且无法访问父窗口的history.pushState()(因为iframe与apps.facebook.com不是同一个域)。另一种技术应该只改变地址的哈希部分,即pushState,但出于同样的原因,也不能在iframe中进行。

可以通过使用

重新加载整个页面来更改父页面URL
window.location.hash = "1"

但是,这会导致父页面重新加载,占用大量秒数,然后重新加载iframe - 总而言之,这对用户来说是一个非常漫长而令人沮丧的体验。

有没有办法做到这一点我还没有想过?

1 个答案:

答案 0 :(得分:3)

我几乎可以肯定,如果没有Facebook的特殊帮助,就没有办法做到这一点。例如,Facebook可以在画布页面上实现一个脚本,该脚本利用postMessagehttps://developer.mozilla.org/en-US/docs/DOM/window.postMessage)来监听来自iframe的跨域消息。

但如果没有Facebook的合作,我认为任何现代的标准浏览器都不允许你这样做。