Javascript 在backbone.js Facebook应用程序中添加历史状态(在iframe中)

Javascript 在backbone.js Facebook应用程序中添加历史状态(在iframe中),javascript,facebook,html,iframe,backbone.js,Javascript,Facebook,Html,Iframe,Backbone.js,我正在开发一个使用0.3.3的Facebook应用程序,并试图让后退按钮为用户正常工作 主干通过URL哈希保存状态,URL哈希用于执行内部路由。例如,#home将加载主页,#session是另一个页面。当这种情况发生在iframe之外时,会保存历史记录,因此可以使用“后退”按钮正确导航 iframe内部的导航不是问题,所有链接都可以工作,但浏览器不会保存任何历史记录 问题: Facebook iframe指向http://app.example.com,这是主干应用程序如何让“后退”按钮在Fac

我正在开发一个使用0.3.3的Facebook应用程序,并试图让后退按钮为用户正常工作

主干通过URL哈希保存状态,URL哈希用于执行内部路由。例如,
#home
将加载主页,
#session
是另一个页面。当这种情况发生在iframe之外时,会保存历史记录,因此可以使用“后退”按钮正确导航

iframe内部的导航不是问题,所有链接都可以工作,但浏览器不会保存任何历史记录

问题:

Facebook iframe指向
http://app.example.com
,这是主干应用程序如何让“后退”按钮在Facebook应用程序上为用户工作?使用主干网的现有解决方案可获得额外积分


我已经从几个角度研究了这个问题,但在任何地方都找不到令人满意的解决方案。似乎很少有Facebook应用程序使用主干网/如此依赖Javascript


我认为解决方案是向iframe的父窗口添加历史状态,但我不知道如何做到这一点。HTML5历史?某种Facebook API?即使是部分解决方案(适用于现代浏览器)也比目前的情况更可取。

我认为你的Facebook应用程序处于他们所谓的沙箱中。因为它是一个沙箱,所以它不是一个直接的iframe,包含来自您网站的源代码。事实上,Facebook从你的网站上读取源代码,将其放入他们的沙盒中,并在iframe中呈现沙盒

我不确定这是否仍然是真的。在旧的Facebook应用程序中,在这个沙箱中,许多JavaScript API被劫持。例如,
document.getElementById
不是原始的
document.getElementById
。它是另一种东西,只能检索沙箱中的元素。它们确保您将使用的几乎所有JavaScript api都能按预期运行,但不能到达沙箱之外的任何地方

一个问题是它们没有模仿原始的window.location行为。我想那是因为他们认为这应该超出你的范围。应用程序位于画布(沙盒)中,沙盒位于iframe中。所以iframe应该是你够不着的


到目前为止,我还没有在Facebook画布上实现历史API支持的想法。因为整个页面被Facebook劫持,你不能把任何东西放在Facebook的域中,你的页面实际上是在一个你无法控制的域中。在这种情况下,到目前为止,我想不出可能的解决方案。

您是否检查过iframe url在用户导航期间是否具有类似于
#home
的散列?因为在iframe中,Facebook劫持了很多JavaScript API,所以我不确定window.location是否被劫持。@Cat Chen:iframe
src
属性设置为
JavaScript:
,我在使用Chrome开发控制台查找iframe的真实URL时遇到了困难(我认为跨域策略是罪魁祸首)。我明白了。我有一个解释(见我的答案),但我还没有解决办法。@Wylie你能找到这个问题的解决办法吗?我也有同样的经历issue@ekeren不,我只是忽略了这个问题。这是一个很好的解释,我没有意识到这一点,但可以潜在地解释为什么历史没有被保存。我仍然希望有一个能够让我们拥有历史的解决方案,但如果不可能,我将停止尝试添加Facebook限制的功能。你能在画布中添加iframe吗?如果可以,你可以试着用那个iframe记录历史。@Jeff:你能详细说明一下吗?我知道iFrame有跨域限制,但在许多情况下,iFrame可以保存历史。