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

ono*_*n15 9 iframe facebook same-origin-policy pushstate facebook-canvas

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

通常,我的应用程序可以使用HTML5 history.pushState().问题是,在画布上应用的iframe中运行,而不能访问父窗口的pushState(因为iframe是不是同一个域中apps.facebook.com).另一种技术应该只改变地址的哈希部分,即window.location.hash = "1",出于同样的原因,也不能在iframe中进行.

通过使用,可以通过重新加载整个页面来更改父页面URL

window.parent.location = "https://apps.facebook.com/myapp/1/"
Run Code Online (Sandbox Code Playgroud)

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

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

Aar*_*ter 3

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

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