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

Posted

技术标签:

【中文标题】有没有办法 pushState() facebook 画布中的父窗口?【英文标题】:Is there a way to pushState() the parent window in facebook canvas? 【发布时间】:2013-02-13 01:52:44 【问题描述】:

我希望我的 facebook 画布应用能够在更改上下文时更新地址栏 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/"

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

有没有我没想到的方法?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

你是对的。不幸的是,Facebook API 没有这样的方法,尽管恕我直言,这是一个相当简单的添加方法,假设验证域前缀匹配足以防止 XSS。如果您认为此类 API 对您的使用有用,请在 FB 投票:developers.facebook.com/bugs/133461353503702 +1。不过,他们似乎暂时将其留在“愿望清单”上。

以上是关于有没有办法 pushState() facebook 画布中的父窗口?的主要内容,如果未能解决你的问题,请参考以下文章

Safari在pushState / replaceState之后刷新时发送POST请求

使用 HTML5 History API 的好教程(Pushstate?)[关闭]

通过JS拦截 pushState 和 replaceState 事件

在pushState上获取路径特定的cookie

无刷新跳转—关于history中pushState和replaceState方法详解

无刷新跳转—关于history中pushState和replaceState方法详解