那么,是谁发明了Ajax?要找出真正的源头,为此总免不了一场争论;不过,有一点是确定的,2005年2月,Adaptive Path的JesseJames Garrett最早造了这个词。在他的文章“Ajax: A New Approach to Web Applications”(Ajax:Web应用的一种新方法)中,Garrett讨论了如何消除胖客户(或桌面)应用与瘦客户(或Web)应用之间的界限。当然,Google在Google Labs发布Google Maps和Google Suggest时,这个技术才真正为人所认识;而且此前已经有许多这方面的文章了。但确实是Garrett最早提出了这个词,否则我们就得罗罗嗦嗦地说上一大堆:异步(Asynchronous)、XMLHttpRequest、JavaScript、CSS、DOM等等。尽管原来把Ajax认为是 Asynchronous JavaScript + XML(异步JavaScript + XML)的缩写,但如今,这个词的覆盖面有所扩展,允许浏览器与服务器通信而无需刷新当前页面的技术都涵盖在内。
你可能会说,“哦,那有什么大不了的?”。这么说吧,使用XHR,而且与服务器异步通信,这样就能创建更加动态的Web应用。例如,假设你有一个下拉列表,这个列表是根据另外一个域或下拉列表的输入来填写的。正常情况下,必须在加载第一个页面时把所有数据都发送给客户,然后使用JavaScript根据输入来填写下拉列表。这么做并不困难,但是会让你的页面变得很臃肿,取决于你的下拉列表到底有多“动态”,页面很可能膨胀得过大,这就有问题了。利用 Ajax的话,当作为触发源的域有变化,或者失去了输入焦点,就可以向服务器做一个简单的请求,只要求得到更新下拉列表所需的部分信息。
来单独考虑一下验证。你写过多少JavaScript验证逻辑?用Java或C#编写验证逻辑可能很简单,但是由于JavaScript缺乏很好的调试工具,再加上JavaScript是一种弱类型语言,所以用JavaScript编写验证逻辑实在是一件让人头疼的事情,而且很容易出错。服务器上还很有可能重复这些客户端验证规则。使用XHR,可以对服务器做一个调用,触发某一组验证规则。这些规则可能比你用JavaScript编写的任何规则都更丰富、更复杂,而且你还能得到功能强大的调试工具和集成开发环境(IDE)。
你现在可能又会说,“这些事情我早已经用IFRAMES或隐藏框架做到了。”我们甚至还使用这种技术来提交或刷新过页面的一部分,而不是整个浏览器(页面);不能不承认,这确实可行。不过,许多人认为这种方法只是一种修补手段,以弥补XHR原来缺乏的跨浏览器支持。作为Ajax的核心,XHR对象设计为允许从服务器异步地获取任意的数据。
我们讨论过,传统的Web应用遵循一种请求/响应模式。如果没有Ajax,对于每个请求都会重新加载整个页面(或者如果利用IFRAMEs,则是部分页面)。原来查看的页面会放到浏览器的历史栈中(不过,如果使用了IFRAMEs,点击“后退”(back)按钮不一定能得到用户期望的历史页面)。与此不同,用XHR做出的请求不会记录在浏览器的历史中。如果你的用户习惯于使用后退按钮在Web应用中导航的话,就可能会产生问题。
1.4 可用性问题
前面谈到的都是用户的期望,除此以外,可用性也不能不提。Ajax方法相当新,还没有多少成熟的最佳实践或启发规则。不过,标准Web设计原则还是适用的。随着时间推移,越来越多的人开始尝试这种方法时,就会发现可能存在哪些限制,并建立适当的指导原则。也就是说,你应该让用户来指导你。取决于在应用中如何使用Ajax,你可能会动态地改变页面中的某些部分;习惯于整个浏览器完全刷新的用户可能不会注意到与以前有什么变化。这个问题引出了一些新的特性,如37signals所普及的黄褪技术(Yellow Fade Technique,YFT),这个特性已经用在Ajax的旗舰应用Basecamp中。