1.6 避免常见的陷阱
Ajax确实可以彻底地改进用户体验。但是,我们也要留心几个陷阱。你可能只会遇到这些问题中的一两个,但是在你开始到处使用Ajax之前,应该牢记以下几点。
无法链接的页面:你可能已经注意到了,在我们展示的大多数图片中,地址栏并不会随着页面的变化而改变。当使用XMLHttpRequest对象与服务器通信时,我们无需修改地址栏中显示的URL。虽然这对某些Web应用来说是件好事,但这也意味着用户不能把页面存为书签或把URL发送给他们的朋友(考虑一下地图或驾驶方位图)。这并不是不能克服的,事实上,Google Maps现在就包含了一个叫做“链接到本页(Link to this page)”的链接(见图1-5)。如果链接对你的应用或网站来说很关键,那就要意识到Ajax会给这一点增加一些挑战性(有些框架(如Dojo)为这个问题提供了解决方案)。

图1-5 Google Maps的“链接到本页(Link to this page)”链接
异步的改变:Ajax的真正优势之一就是能与服务器异步的通信;然而,这也不是毫无问题的。我们已经说过很多次了,但是它值得我们再次强调:用户已经习惯了整个页面重绘这种风格,因此当你只更新了页面的一小部分时,他们可能不会注意到。仅仅因为你能够重新载入页面的某些部分并不意味着这适用于整个应用——要明智地使用这种方式。同时也要小心,不能向服务器发送多个重叠的异步请求。如果没有适当地编写客户端代码,服务器又没有返回十分准确的响应,就可能会得到出人意料的结果(或在测试中得到这种结果)。
缺少可视化的提示:因为整个页面不会被重绘,所以用户就有可能察觉不到一些变化。这最终导致了Fade Anything Technique(FAT,本章后面会讲到)的出现,但是也有其他的选择。例如,Gmail使用“加载(Loading)”图标来指明它正在执行一些操作(见图1-6)。根据应用的不同,可能不得不添加一些指示,这样用户才会知道发生了什么。
![]()
图1-6 Gmail的“加载(Loading)”图标
无效的“后退”按钮:有些Web应用故意地禁止了浏览器的“后退”按钮,但是这种网站为数极少。当然,使用了Ajax,单击“后退”按钮就不会执行什么操作。如果用户希望“后退”按钮能正常工作而你又在使用Ajax组装页面的某些部分,可能就得解决一些问题了(同样,一些框架(如Dojo)提供了解决这个问题的方法)。
代码膨胀:千万别忘了,驱动Ajax应用的JavaScript运行在客户端本地。虽然很多开发人员都拥有内存(RAM)较大的高性能机器,但是有些用户仍然在使用无法提供这种性能的老式机器。如果你在应用中编写了太多的JavaScript,客户端就可能会发生响应迟缓的现象。即使JavaScript运行正常,更多的JavaScript也意味着更大的页面,也就意味着更长的下载时间。在我们都使用宽带和双处理器电脑之前,请保持JavaScript尽可能地少。
千里之堤,溃于蚁穴:Ajax应用可以轻松地发送异步调用,与此同时,它也会变得比较琐碎(chatty)(还记得早期的实体bean吗?)。不应该为了添加Ajax而添加Ajax。需要仔细考虑对服务器的每个调用。大量细粒度的调用会给你的服务器架构带来相当不好的影响,因此需要长时间使用负载测试工具。自动完成功能(Autocomplete,见图1-7)就可能会变得十分琐碎,虽然它是最引人注目的Ajax控件之一。一定要小心使用Ajax。
暴露业务层:千万不要忘了,JavaScript代码会被发送到客户端去,而且虽然你的确可以混淆代码,但是如果有人确实想看看你做了什么的话,他们是能看到的。把这一点铭记在心,对你在JavaScript中编写的内容一定要非常小心。暴露服务器工作的细节会使你对心怀不轨的人门户大开。

图1-7 Google Suggest的自动完成示例
忘记了安全性:无论持不同意见的人如何争论,Ajax并没有引入任何新的安全隐患。然而,这并不意味着可以对此置之不理。所有常规Web应用所具有的标准的安全问题仍然会存在于Ajax应用中。
打破了既定的用户界面惯例:Ajax使得开发人员可以创建比以往丰富得多的Web应用。但是,这并不会消除对普通用户界面的需求。仅仅因为能做一些事情并不意味着应该去做。同样地,对你的用户来说,漂亮的Ajax新特性也并不一定就是显而易见的,因此不要害怕提供一些提示,就像Netflix对它的电影队列所做的那样(见图1-8)。用户可以简单地通过拖放电影的方式改变它们的顺序,但是在经过了多年的Web应用洗礼之后,许多用户可能根本就没有发现他们原来还可以这样做。
如何才能知道你是否已经陷入了这些陷阱呢?怎么强调都不过分的一点是:让具有代表性的用户测试你的设计。在发布漂亮的新Ajax特性之前,做一些纸面上的实验,在你费力开发这些特性之前去和几个用户模拟运行一下。一两个小时的测试能够避免之后陷入更大的问题中。

图1-8 Netflix的队列







