Gmail使用#当你在点击邮件区分页面(+ Ajax的动作)。 http://mail.google.com/mail/#inbox/1238e709e37a1394
我发现: 谷歌使用#,而不是搜索? 在URL。 为什么?
在FF或Chrome可以前进和后退没有使用这些URL之间刷新: http://X.com/MyPage.aspx#1 http://X.com/MyPage.aspx#2 http://X.com/ MyPage.aspx#3
但在IE浏览器的页面刷新,并没有经过#时,由后面的动作算PARAMS。
Gmail中如何让奇迹发生?
我可以给你答案,因为我已经面对和解决这个问题。
有几个概念,首先要明白这里:
- JavaScript不能直接改变浏览器历史记录。
- 只要在页面变化的iframe的基本URL,历史被更新。 (不过这有一些怪癖不同的浏览器)。
- 网址有一个“哈希”部分:例如,在URL
http://mail.google.com/mail#inbox
, #inbox
是散列部分。 让我们称之为“哈希”。 所以http://mail.google.com/mail
将是我们的“基础URL”。
通过GMail的跟踪历史使用基于这种“散”的招数主要是做。
于是,几个概念:
- 当在地址栏中的URL改变了,历史被更新(以前的网址进入历史)
- 当基本URL得到改变,重新加载页面。
- 当URL的散列部无底座URL变化改变时,页面未重载。
所以,当你从去http://mail.google.com/mail#inbox
到http://mail.google.com/mail#sent
,页面没有得到刷新 。
现在,如果Gmail是获得一个事件通知时,哈希改变,那么Gmail中可以采取基于该行动。 不幸的是,没有DOM事件,可以帮助我们抓住历史行为。 因此,而不是(这是显示我是如何克服这个问题的部分),我们运行一个无限循环来检查对哈希。 如果观察到的变化,那么我们检测到点击到浏览器的“后退”或“前进”按钮。
在解决这个问题,我做了一个方便的工具:该URL解析器 。 它可以分析得到的散列编码的网址参数,以及PARAMS。 给演示一展身手!
干杯!
关于IE浏览器中的这个问题:我没有意识到,这种“哈希”基础的解决方案不能在IE(可怜的Linux开发)工作。
但是,对于IE浏览器,你可以使用一个隐藏的iframe,并使用其“URL历史的影响”属性来实现的历史。 我知道这种说法缺乏细节,但是从我自身缺乏与IE经验造成的。
我会尝试这个解决方案,并跟进:)
我发现在互联网上的联系,即用做I帧/位置哈希历史的正确实现的主机。 我没有耐心去挖掘在各种浏览器IFRAME接口之间的差异。
我想我会喜欢的jQuery插件 。 YUI有历史的经理了。
干杯!
这就是我一直在寻找: http://nix.lv/history/demo.html#3
发现它: 保存停泊在历史的IE6