Gmail是如何处理富JavaScript的后退/前进功能的?

8

Gmail似乎有一种聪明的方式来处理JS应用程序中的后退/前进按钮。

在我们的组织中,我们试用了jQuery历史插件。该插件基本上每100毫秒运行一个函数,解析URL并测试其是否已更改。历史记录由HTTP锚点跟踪,如果锚点已更改,则插件调用用户指定的回调,并传递新锚点,以便页面可以执行自定义行为来加载新内容。

我们的组织确定jQuery历史插件不是生产质量。说实话,我不怪他们,因为你真的不想强制用户的浏览器每100毫秒运行一个函数。此外,它使JS代码几乎不可能调试,因为在Firebug或类似的JS调试器中点击“下一个断点”将始终捕获jQuery历史事件,而其他事件则无法查看。

因此,我们放弃了在浏览器中实现后退/前进功能的想法。然而,我最近注意到Gmail实现得相当好。它还使用HTTP锚点值,但我按下“下一个断点”,Gmail并没有每100毫秒运行任何类型的函数。 Gmail如何成功实现这种后退/前进行为呢?


2个回答

6
也许你在这里谈论的是 jQuery 历史插件: http://www.balupton.com/projects/jquery-history 它已被用于许多生产质量的网站;其中我最喜欢的是 http://wbhomes.com.au/ 如果是这样,它会对 旧一代浏览器 进行 200ms 的测试,这些浏览器没有本地实现 onhashchange 事件。如果没有本地实现该事件,您必须通过使用间隔更改来解决其功能 - 在我所知道的范围内,没有其他方法。幸运的是,所有主要浏览器的最新版本现在都原生支持 onhashchange 事件,因此不再需要进行此检查。
但是,让我们深入了解那个200毫秒的间隔检查到底做了什么。如果他们使用IE6或7,它将检查iframe的状态(在这些浏览器中,iframe是模拟后退和前进按钮所必需的,而对于其他浏览器,则不需要iframe)。如果他们使用的是另一个旧的不是IE的浏览器,则可以在检查中使用location.getHash()(如前所述,不需要iframe)。这两种类型的检查旨在非常快速,并尽可能少地带来必要的开销。它关键在于浏览器实际上愿意让你做什么,以及试图使用最少量的代码来完成它。
注意:在jQuery History v1.4.2-final(2010年8月12日)之前的版本中,唯一支持原生onhashchange的浏览器是IE8及以上版本。这在所有新版本的jQuery History项目中都得到了解决。

已经发布了jQuery History的更新,所以新一波浏览器不再使用间隔检查。您可以在此处查看nativeSupport检查的新源代码: http://github.com/balupton/jquery-history/blob/133790d9884b7d317b777220ba975c99e9c11de6/scripts/resources/jquery.history.js#L304如果您对jQuery History有任何其他疑虑或反馈,我们将非常乐意在此支持页面听取您的意见: http://getsatisfaction.com/balupton/products/balupton_jquery_history - balupton

1

以下是关于 YUI 浏览器历史管理器的制作背景信息:http://yuiblog.com/blog/2007/02/21/browser-history-manager/。 - ptrin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接