想法与目标
从AJAX诞生至今,就存在着Back/Forward Button和bookmark失效的问题,我 以前一般提倡,一个好的AJAX应用应该不让用户有点击“Back/Forward”的想法 ,并且使用某种方式提供给用户一个能够记录直接产生页面的Bookmark。 Windows Live Local应该是这种应用最好的典范之一,其灵活的交互,良好的界 面让我在初遇时不得不眼前一亮。
另外,我也曾经见过把后退按钮禁用的做法(其实这样对于解决问题的确不 错),不过这些都似乎只是一个workaround,设法避开这个AJAX应用普遍存在的 问题。似乎Gmail能够支持Back按钮,但是我惊奇的发现,在点击Back后,却不 能使用Forward,所以这还不算成功的解决这个问题。那么能否解决?似乎已经 有了一定的实现。
事实上,之所以我会产生实现自己的解决方案的想法,是因为从Nikhil Kothari的Blog上看到了他的解决方案(点击这里查看)。他实现了一个 HistoryControl控件,可以在页面中配合UpdatePanel使用,在一定程度上实现 了对Back/Forword Button已经Bookmark的支持。但是正如他在Blog上所说的, 这只是他的一个prototype。我在使用了他的演示之后,也的确发现了一些问题 (演示也能从Nikhil的Blog上下载):
HistoryControl是一个Server控件,必须配合UpdatePanel使用,并没有对于 Atlas的客户端应用甚至普通的AJAX应用提供基本的支持。
不支持FireFox(不知为何,我在自己尝试之后觉得支持FireFox比IE容易实 现)。
在IE里使用时,从Back和Forward的下拉框里可以看出,那些Title都成为了 “Empty Page”。
不支持在Back和Forward下拉框中选择一项History跳转。
如果访问了别的站点再Back,则在IE下不支持多次回退。
部署麻烦。事实上我觉得很奇怪,我除了直接在他的项目中成功运行之外。 部署到别的项目或者是我的空间都有问题,怎么也找不出原因,估计是文件路径 问题,需要仔细读一下他的代码。
总之,这个解决方案还很不成熟,但是我们要对Nikhil,Atlas和微软有信心 ,对于Back/Forward的内置支持应该会出现在Atlas的后续版本中。
于是我想,不如我来实现一个自己的吧,虽然我一直提倡软件复用,但是如 果找不到成熟的解决方案,那么就该发挥程序员的主观能动性了。对于我最后的 实现,它有以下特点:
一个轻量级的JS解决方案。虽然我是在Atlas的基础上写的,但是只是使用了 Atlas中的Sys.Timer类,很容易修改成独立于任何库的JS代码。
支持IE和FireFox。
简单的支持Back和Forward的下拉框里的Title文字,在大多数情况下不会出 错。产生Nikhil的这个问题的原因在阐述我的实现时会提及。我简单地解决了这 个问题,但是没有设计出完整支持title问题的完美实现。我有一些想法,似乎 十分复杂,在尝试时都宣告失败。
支持在Back和Forword下拉框中选择一项History跳转。
支持Bookmark,用户可以轻松将页面加入收藏夹。
易于使用,部署简单。
对于我列出Nikhil的实现里的第5个问题,我想了一些办法,却依旧没有解决 。现在虽然脑子里有想法,但还需要继续尝试。