标题：Ajax实战：实例详解
图书信息
书名： Ajax实战：实例详解  [1]书号： 978-7-115-18765-9/TP  
原书名： Ajax in Practice  
原出版社： Manning Publications  
丛书名： 图灵程序设计丛书  
分类： 计算机 >> Web编程与设计 >> JavaScript  
作者： Dave Crane, Jord Sonneveld, Bear Bibeault, Ted Goddard, Chris Gray, Ram Venkataraman, Joe Walker  
译者： 贺师俊 许超 金擘 等译 贺师俊 审校  
出版日期： 2008-10-14  
语种： 简体中文  
开本： 16开  
页数： 400
作者简介
贺师俊,资深Web开发专家，对HTML、JavaScript以及Web标准有非常深刻的认识，翻译并审校了《Ajax实战：实例详解》一书。他在JavaEye等技术社区非常活跃，是网友公认的专家级人物。
摘要
本书堪称Ajax 领域内的典范之作，深受读者好评。它以Ajax 的简要介绍开篇，然后以知识点为脉络， 讲述了几十个易于使用的、以解决方案为重点的实例，并针对每一个实例给出了详细的范例代码，可操作性极强。通过本书，读者可以学会如何实现富客户端用户界面，包括拖拽、实践性策略、有效导航、事件处理、表单项目验证、状态管理、Ajax 库的选择、访问第三方的开放网络服务接口，等等。最后，本书以一个妙趣横生且极其实用的mashup 实例结尾。
本书适合所有的现代Web 开发人员。
媒体评论
“通过本书中的示例，我掌握了大量关于Ajax的核心技巧和高级JavaScript技术，绝对必读的Ajax著作!”. 
——Javaranch
“我太喜欢这本书了。具体、实用，可以立刻付诸实践。我强烈推荐!”
——Amazon
目录
第一部分　Ajax基础
第1章　拥抱Ajax　2
1.1　Ajax，一种颠覆性的技术　3
1.1.1　重新定义用户的工作流程　3
1.1.2　重新定义Web应用的架构　4
1.2　Ajax快速入门　6
1.2.1　XMLHttpRequest简介　6
1.2.2　实例化XMLHttpRequest　7
1.2.3　发送请求　8
1.2.4　处理响应　9
1.2.5　XMLHttpRequest的其他方法和属性　10
1.3　使用框架简化Ajax　11
1.3.1　用Prototype库中的Ajax.Request对象创建请求　12
1.3.2　简化Ajax响应　15
1.4　总结　18
第2章　Ajax的通信方式　19
2.1　在服务器端生成JavaScript　19
2.1.1　执行由服务器生成的代码　19
2.1.2　遵循代码生成的实践准则　21
2.2　JSON简介　25
2.2.1　在服务器上生成JSON　26
2.2.2　使用JSON往返传输数据　29
2.3　在Ajax中使用XML和XSLT　33
2.3.1　解析服务器生成的XML　34
2.3.2　用XSLT和XPath来更好地处理XML　38
2.4　在Web服务中使用Ajax　43
2.5　总结　49
第3章　面向对象的JavaScript与Prototype库　50
3.1　面向对象的JavaScript　51
3.1.1　对象的基本原理　51
3.1.2　函数是一等公民　53
3.1.3　对象构造器和方法　58
3.1.4　编写JavaScript类：一个按钮　63
3.2　Prototype程序库　74
3.2.1　常用的函数和扩展　75
3.2.2　对数组的扩展　76
3.2.3　Hash类　78
3.2.4　给函数绑定上下文对象　79
3.2.5　面向对象的Prototype　80
3.2.6　用Prototype重写Button类　86
3.3　总结　89
第4章　Ajax开源工具集　90
4.1　Dojo工具包　90
4.1.1　用Dojo进行异步请求　91
4.1.2　用Dojo自动对表单进行编组　94
4.2　Prototype　96
4.2.1　Prototype中的异步请求　96
4.2.2　用Prototype进行自动更新　100
4.2.3　用Prototype进行定期更新　102
4.3　jQuery　104
4.3.1　jQuery基础　104
4.3.2　用jQuery进行异步加载　106
4.3.3　用jQuery获取动态数据　110
4.4　DWR　113
4.5　总结　120
第二部分　Ajax最佳实践
第5章　事件处理　124
5.1　事件处理模型　125
5.1.1　基本的事件处理注册　125
5.1.2　高级事件处理　128
5.2　Event对象与事件传播机制　130
5.2.1　Event对象　130
5.2.2　事件的传播　131
5.3　使用Prototype进行事件处理　135
5.4　事件类型　137
5.4.1　鼠标事件　137
5.4.2　键盘事件　138
5.4.3　change事件　141
5.4.4　页面事件　142
5.5　事件处理实践　144
5.5.1　在服务端验证文本字段　144
5.5.2　无需页面重新加载的表单元素提交方式　148
5.5.3　只提交发生改变的元素　151
5.6　总结　153
第6章　表单验证与提交　154
6.1　客户端表单验证　154
6.1.1　在客户端进行验证　154
6.1.2　即时验证　159
6.1.3　跨字段验证　160
6.2　投递数据　166
6.2.1　POST请求剖析　167
6.2.2　将数据投递到服务器　168
6.2.3　将表单数据投递到服务器　171
6.2.4　检测表单数据变化　173
6.3　总结　179
第7章　内容导航　180
7.1　网站导航原理　180
7.1.1　大海捞“针”　180
7.1.2　创造更好的“针”探　182
7.1.3　导航和Ajax　184
7.2　传统的Web导航　185
7.2.1　一个简单的导航菜单　185
7.2.2　DHTML菜单　187
7.3　借鉴桌面应用的导航设施　190
7.3.1　使用qooxdoo库实现Tab组件　191
7.3.2　qooxdoo工具栏和窗口　193
7.3.3　qooxdoo树组件　196
7.4　桌面应用和Web应用的折中　200
7.4.1　OpenRico库的Accordion控件　200
7.4.2　创建HTML友好的树控件　203
7.5　总结　209
第8章　处理后退、刷新和撤销　210
8.1　禁止用户访问浏览器的导航控件　210
8.1.1　移除浏览器导航工具栏　210
8.1.2　捕捉快捷键　212
8.1.3　禁止右键弹出上下文菜单　212
8.1.4　阻止用户导航历史记录或刷新页面　212
8.2　与浏览器导航控件协作　216
8.2.1　使用JavaScript内建的history对象　216
8.2.2　使用Hash对象实现书签　217
8.2.3　RSH框架介绍　218
8.2.4　使用RSH框架维护客户端状态　219
8.2.5　使用RSH在服务端维护应用程序状态　222
8.3　处理撤销操作　227
8.3.1　何时提供可撤销功能　227
8.3.2　实现一个可撤销/恢复操作栈　227
8.3.3　扩展撤销栈以支持更复杂的用户操作　232
8.4　总结　240
第9章　拖放　241
9.1　支持拖放的JavaScript框架　242
9.2　Ajax应用中的拖放　243
9.2.1　支持拖放的Ajax购物车示例　243
9.2.2　拖放列表中的数据操纵　249
9.2.3　使用ICEfaces创建Ajax购物车　253
9.3　总结　261
第10章　对用户友好一点　262
10.1　与延迟作斗争　263
10.1.1　以反馈来应对等待　263
10.1.2　显示进度　268
10.1.3　Ajax请求超时　273
10.1.4　处理多次点击　275
10.2　预防和检测输入错误　278
10.2.1　主动显示上下文帮助　278
10.2.2　对表单输入项进行有效性验证　283
10.3　维护焦点和分层顺序　290
10.3.1　维护焦点顺序　290
10.3.2　管理堆叠顺序　294
10.4　总结　299
第11章　状态管理和缓存　300
11.1　客户端状态的维持　301
11.2　服务器数据缓存　303
11.2.1　Java类的数据的交换　303
11.2.2　预取　310
11.3　客户端状态的持久化　313
11.3.1　以JSON形式存储和取回用户状态　313
11.3.2　通过AMASS保存JSON字符串　315
11.4　总结　319
第12章　开放式Web API和Ajax　320
12.1　Yahoo!开发者网络　321
12.1.1　Yahoo!地图　321
12.1.2　跨服务器代理　324
12.1.3　Yahoo! Maps Geocoding　331
12.1.4　Yahoo!交通　335
12.2　Google搜索API　340
12.3　Flickr图片分享　349
12.3.1　Flickr用户内部标识　350
12.3.2　Flickr图片和缩略图　353
12.4　稍等！据说，还有很多……　357
12.4.1　Amazon服务　357
12.4.2　eBay服务　357
12.4.3　MapQuest　357
12.4.4　NOAA/国家气象服务　358
12.4.5　更多Web服务接口　358
12.5　总结　358
第13章　使用Ajax进行混搭　359
13.1　Trip-o-matic应用简介　359
13.1.1　应用的目的　359
13.1.2　应用概览和需求　360
13.2　Trip-o-matic的数据文件　360
13.2.1　我们应该采用什么格式　361
13.2.2　旅行数据格式　361
13.2.3　设置Flickr照片集　363
13.3　TripomaticDigester类　363
13.3.1　依赖性检查　364
13.3.2　TripomaticDigester的构造器　364
13.3.3　解读旅行数据　365
13.3.4　加载经典信息　366
13.3.5　收集元素的文本内容　367
13.4　Tripomatic应用类　368
13.4.1　Tripomatic类和构造器　369
13.4.2　创建内容元素　370
13.4.3　填充旅行数据　372
13.4.4　显示地图　374
13.4.5　加载缩略图　375
13.4.6　显示照片　377
13.5　Trip-o-matic应用页面　378
13.5.1　Trip-o-matic的HTML文档　378
13.5.2　样式之旅　379
13.6　总结　381
前言
Web始终都是催生创新的温床，在它不长的历史里，以某项创造为基础进行重造和重用，以致在某些方面远远超出原始发明者意图的例子比比皆是。例如，CGI取代了一种基于网络的文档检索协议，同时又提供了从后台数据库中取得数据并（根据实时请求）动态生成文档的能力；HTTP首部被用来在无状态协议之上提供持续的用户会话，这使预订系统和电子商务等有状态应用成为可能；在核心协议上创建的加密层，给那些网上商店的顾客和业务应用的用户以信心。
这些突破性的技术永久地改变了人们使用Web的方式。时至今日，诸如服务器端页面、用户会话以及SSL等技术只是构建Web应用的日常构件，并成为所有Web开发人员工具箱里的必备，以至于我们认为这是理所当然的。然而，Web创新的步伐仍然没有停止，几乎每周都会有新的Web框架出现。
Ajax是近年来Web开发领域最大的突破性技术之一。先前的所有创新对Web用户界面（点击、发送请求、响应、重绘页面）的基本模式没有多大影响，直到XMLHttpRequest（XHR）对象1999年悄然出现在IE 5中时，这一状况才结束。该对象的使用最初是为了增强Outlook Web Access客户端程序，并未引起太大的关注。
2005年，当Google举起Ajax的旗帜开发邮件（Gmail）、地图和Suggest等应用时，人们才开始猛然醒悟，关注起Ajax来。来自Adaptive Path公司的Jesse James Garrett提出了“Ajax”这一术语，树起一面大旗，人们云集旗下讨论Ajax究竟是什么，可以用它做什么。
Ajax好像只是在等待一个名字，一旦有了，一系列令人兴奋的活动接踵而至，而人们也开始研究Ajax的技术本质。Ajax引入了一种创建Web应用的全新的方式。尽管这也导致有许多新的问题亟待解决，但随着Web开发社区不断突破新的极限，过去两年爆发了新一轮创新热潮。
沿着这种发展路线，Ajax的基础（例如XMLHttpRequest对象）将重复服务器端页面、用户会话以及SSL的道路。处于集体无意识的Web开发社区犹如神助，一下子明白了Ajax技术的根本，并转向如何解决使用中产生的更广泛的问题。
为解决这些问题，我们决定撰写本书。我们希望本书能帮助熟练的和不那么熟练的Web开发者完全掌握Ajax技术并成功创建其自己的Ajax应用。它可以看作是第二代Ajax图书：第一代Ajax图书介绍Ajax是什么，而第二代Ajax图书介绍可以用它做什么以及如何做。
本书从Manning出版社联系Steve Benfield并希望他成为第二代Ajax图书的主编开始启动，可以看作是Dave Crane所著畅销书《Ajax实战》的后续之作。后来，Steve因故不再担任主编，于是Jord Sonneveld、Bear Bibeault和Dave Crane携手为你奉献了本书。
当你看完前言，我们就完成了自己的任务，因此可以坐下来分享几杯早该享用的饮料。我们希望你在阅读本书时能获得和我们写作本书时一样多的乐趣！
关于本书
Ajax席卷了Web开发社区，它使Web开发人员得以创建以客户为中心的富因特网应用。不过它也给这些应用带来了新的复杂性和多样性。本书抓住Ajax的核心内容，提供了大量实践性技巧和可重用的代码，以帮助开发者解决创建Ajax解决方案时遇到的具体问题。
简要介绍Ajax之后，本书将带领读者领略几十个易于使用的、以解决方案为重点的示例。读者可以学会如何实现富客户端用户界面，包括拖拽实践性策略、有效导航、事件处理、表单项验证、状态管理、如何选择Ajax库、访问第三方的开放WebAPI等实用策略。
与传统的“cookbook”类图书不同，本书提供对各个技巧的深入讨论并演示如何将这些独立的组件连接起来，以创建强大的应用解决方案。本书结尾一章是令人愉快的“混搭(mashup)”，之所以选择该示例，是因为它有趣、好玩，更重要的是它很实用。
本书将帮助你：
□超越Ajax本身并学习如何让Ajax运行起来；
□掌握许多用户界面设计和站点导航的技巧；
□动手实践专业级的可重用的Ajax代码以解决实际问题。
读者对象
本书针对那些希望借助Ajax技术创建最佳富用户界面应用的Web开发人员。
Ajax初学者会发现入门的前两章对快速了解异步请求的知识有帮助，但本书面向的主要读者是开发人员，他们应当至少有基本的Web应用开发背景并能使用基础的JavaScript语法实现一些客户端特效。
在前所未有的富客户端用户界面应用里，客户端代码数量迅速增多，因此这部分代码应和服务端代码同样得到重视。本书介绍了一些高级的JavaScript技巧帮助你组织客户端代码并有效使用Ajax。
如果你不仅对使用新技术扩展自身编码能力感兴趣，同时也关注如何应用编程技巧和模式来最好地利用这些技术，我们认为本书能满足你的这些需求。
无论你是老练的客户端开发人员，还是刚开始创建拥有富用户界面的新手，我们都希望本书对你能有所帮助。
阅读路线图
本书分为两部分。第一部分：“Ajax基础”，包含4章导读性的内容，以确保你在学习本书第二部分时已经消化掌握了这些技巧。第二部分“Ajax最佳实践”，每章都讲解了客户端编程的各种实践性主题。它们或强调直接使用Ajax，或强调在支持Ajax的应用中运行良好的实践和原则。
第1章深入探讨Ajax与其他技术的区别，并介绍为何有如此多的内容需要学习。本章提供了一个快速教程介绍如何跨浏览器使用Ajax以及如何处理到来的响应。最后介绍Prototype库如何确保整个过程更加流畅。
第2章讨论了Ajax通信的各种方式，包括JSON、XML和XSLT。我们还研究了Ajax与SOAP Web 服务的结合使用。
第3章介绍了怎样使用面向对象的JavaScript来控制典型的Ajax应用都具备的客户端源代码增长问题。我们介绍的主要概念有对象构造、函数是一等对象、函数是类方法、函数上下文以及闭包等，并在面向对象技术的背景下加以介绍。最后介绍了如何使用Prototype库帮助我们轻松定义JavaScript类。
第4章继续讨论支持Ajax的JavaScript库并进一步讲解Prototype、Dojo工具箱、jQuery和DWR库，虽然不可能完全地介绍这些库具备的各种特性，但我们特别介绍了它们给Ajax带来的变化。我们还会在接下来的章节的多个代码示例中看到这些库的实践用法。
第5章讲解事件处理，介绍了多种事件模型并特别强调了跨浏览器问题，并介绍了使用Prototype库以减轻跨浏览器带来的痛苦。还讨论了Ajax应用程序中最常用的事件类型。
第6章详细研究了表单数据项验证及其与上一章介绍的事件处理的联系。本章示例采用Prototype和jQuery库以获得最大好处。这些示例演示了如何截取表单提交（以前通常会引起整个页面刷新的操作）并把它重定向为不甚唐突的Ajax请求。
第7章讨论内容导航。讲解了创建简单的菜单，然后进入更加复杂的导航辅助设施如树视图、accordion控件、Tab视图和工具条等内容。我们还在本章给出了支持这些功能的OpenRico库和qooxdoo库的相关代码。
第8章关注用户在浏览器中点击后退和刷新按钮导致的问题。我们会从两个角度介绍：如何避免用户出现这些问题以及如何支持后退和刷新操作。本章还会介绍如何为应用程序添加一个简单的撤销功能。
第9章讨论拖放。我们将研究拖放操作的原理并讨论支持拖放的JavaScript库。我们会介绍如何使用Scriptaculous实现支持项目复制的列表，并用Scriptaculous和ICEfaces实现一个简单的购物车。
第10章讨论关于可用性的考虑，并介绍Ajax怎样帮助我们解决或至少减轻网络延时的问题。讨论了通过主动提供由服务器端协助完成的帮助减少用户的挫折感，并再次回顾了表单数据验证。我们还解释了在富用户界面中如何处理多控件Tab键次序以及多层控件次序问题。
第11章介绍状态管理。我们将探索如何维护客户状态、缓存数据、预加载数据和如何持久化客户状态。我们还讨论了使用AMASS库持久化大量数据。
第12章探讨第三方开放的API的用法。我们学习如何避免令人畏惧的“Ajax安全沙箱”使Ajax请求到达远程服务器，然后使用该技巧访问第三方开放的API，例如Yahoo!Maps、Geocoding和 Traffic、Google搜索引擎以及Flickr照片服务等。
第13章以一个完整的混搭式应用结束，它使用了上一章介绍的第三方开放API以及本书介绍的各种技巧来创建一个完整的且可以运行的混搭式应用。
代码约定
所有源代码清单或正文中的源代码都使用一种等宽字体（例如like this）以区别于普通文本。正文中的方法和函数名、对象属性、XML元素都用此类字体显示。
多数情况下，对源代码重新编排了格式。为适应本书的页面宽度，我们增加了换行并调整了缩进。在少数情况下，这样做还不够，源代码清单里还包括续行记号。另外，还从源代码清单中去掉了许多注释。