AJAX
AJAX為“Asynchronous JavaScript and XML”(非同步的JavaScript與XML技術),指的是一套综合了多項技術的瀏覽器端網頁開發技術。Ajax的概念由 Jesse James Garrett 所提出[1]。
传统的Web应用允许用户端填写表单(form),当送出表单时就向Web伺服器发送一个请求。伺服器接收并处理传来的表单,然后送回一个新的网页,但这个做法浪费了许多带宽,因为在前后两个页面中的大部分HTML码往往是相同的。由于每次应用的沟通都需要向伺服器发送请求,应用的回應时间依赖于伺服器的回應时间。这导致了用户界面的回應比本機应用慢得多。
与此不同,AJAX应用可以仅向伺服器发送并取回必須的数据,它使用SOAP或其它一些基于XML的页面服务接口(介面),并在客户端采用JavaScript处理来自伺服器的回應。因为在伺服器和浏览器之间交换的数据大量减少(大约只有原来的5%)。结果,我们感觉伺服器回應更快了。同时,很多的处理工作可以在发出请求的客户端机器上完成,因此Web伺服器的负荷也减少了。
类似于DHTML或LAMP,AJAX不是指一种单一的技术,而是有机地利用了一系列相关的技术。事实上,一些基于AJAX的“派生/合成”式(derivative/composite)的技术正在出现,如AFLAX。
目录 |
应用 [编辑]
- 運用XHTML+CSS來表達資訊;
- 運用JavaScript操作DOM(Document Object Model)来執行動態效果;
- 運用XML和XSLT操作資料
- 運用XMLHttpRequest為Agent與網頁伺服器進行非同步資料交換;
- 運用JavaScript技術来實現。
- 注意:AJAX與Flash、Silverlight和Java Applet等RIA技術是有區分的。
发展史 [编辑]
上个世纪90年代,几乎所有的网站都由HTML页面实现,服务器处理每一个用户请求都需要重新加载网页。这样的处理方式效率不高。用户的体验是所有页面都会消失,再重新载入,即使只是一部分页面元素改变也要重新载入整个页面,不仅要刷新改变的部分,连没有变化的部分也要刷新。这会加重服务器的负担。
这可以用异步加载来解决。1995年,JAVA语言的第一版发布,随之发布的的 Java applets(JAVA小程序)首次实现了异步加载。浏览器通过运行嵌入网页中的Java applets与服务器交换数据,不必刷新网页。1996年,Internet Explorer将iframe元素加入到HTML,支持局部刷新网页。
1998年前后,Outlook Web Access小组写成了允许客户端脚本发送HTTP请求(XMLHTTP)的第一个组件。该组件原属于微软Exchange Server,并且迅速地成为了Internet Explorer 4.0[2]的一部分。部分观察家认为,Outlook Web Access是第一个应用了Ajax技术的成功的商业应用程序,并成为包括Oddpost的网络邮件产品在内的许多产品的领头羊。但是,2005年初,许多事件使得Ajax被大众所接受。Google在它著名的交互应用程序中使用了异步通讯,如Google讨论组、Google地图、Google搜索建议、Gmail等。Ajax这个词由《Ajax: A New Approach to Web Applications》一文所创,该文的迅速流传提高了人们使用该项技术的意识。另外,对Mozilla/Gecko的支持使得该技术走向成熟,变得更为简单易用。
优缺点 [编辑]
使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变的信息。
Ajax不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。就像DHTML应用程序那样,Ajax应用程序必须在众多不同的浏览器和平台上经过严格的测试。随着Ajax的成熟,一些简化Ajax使用方法的程序库也相继问世。同样,也出现了另一种辅助程序设计的技术,为那些不支持JavaScript的用户提供替代功能。
对应用Ajax最主要的批评就是,它可能破坏浏览器的后退功能[3]。在动态更新页面的情况下,用户无法回到前一个页面状态,这是因为浏览器仅能记下历史记录中的静态页面。一个被完整读入的页面与一个已经被动态修改过的页面之间的差别非常微妙;用户通常都希望单击后退按钮,就能够取消他们的前一次操作,但是在Ajax应用程序中,却无法这样做。不过开发者已想出了种种办法来解决这个问题,当中大多数都是在用户单击后退按钮访问历史记录时,通过建立或使用一个隐藏的IFRAME来重现页面上的变更。(例如,当用户在Google Maps中单击后退时,它在一个隐藏的IFRAME中进行搜索,然后将搜索结果反映到Ajax元素上,以便将应用程序状态恢复到当时的状态。)
一个相关的观点认为,使用动态页面更新使得用户难于将某个特定的状态保存到收藏夹中。该问题的解决方案也已出现,大部分都使用URL片断标识符(通常被称为锚点,即URL中#后面的部分)来保持追蹤,允许用户回到指定的某个应用程序状态。(许多浏览器允许JavaScript动态更新锚点,这使得Ajax应用程序能够在更新显示内容的同时更新锚点。)这些解决方案也同时解决了许多关于不支持后退按钮的争论。
进行Ajax开发时,网络延迟——即用户发出请求到服务器发出响应之间的间隔——需要慎重考虑。如果不给予用户明确的回应 [4],没有恰当的预读数据 [5],或者对XMLHttpRequest的不恰当处理[6],都会使用户感到厌烦[7]。通常的解决方案是,使用一个可视化的组件来告诉用户系统正在进行后台操作并且正在读取数据和内容。
支持 [编辑]
- 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;
- 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;
- Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰——用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;
- 对串流媒体的支持没有FLASH、Java Applet好。
兼容性 [编辑]
JavaScript编程的最大问题来自不同的浏览器对各种技术和标准的支持。
XmlHttpRequest对象在不同浏览器中不同的创建方法,以下是跨瀏覽器的通用方法:
// Provide the XMLHttpRequest class for IE 5.x-6.x: // Other browsers (including IE 7.x-8.x) ignore this // when XMLHttpRequest is predefined var xmlHttp; if (typeof XMLHttpRequest != "undefined") { xmlHttp = new XMLHttpRequest(); } else if (window.ActiveXObject) { var aVersions = ["Msxml2.XMLHttp.5.0", "Msxml2.XMLHttp.4.0", "Msxml2.XMLHttp.3.0", "Msxml2.XMLHttp", "Microsoft.XMLHttp"]; for (var i = 0; i < aVersions.length; i++) { try { xmlHttp = new ActiveXObject(aVersions[i]); break; } catch (e) {} } }
AJAX支持的浏览器有:Internet Explorer、Chrome、Firefox、Opera、Konqueror及Mac OS的Safari。但是Opera不支持XSL格式对象,也不支持XSLT[8]。
开发挑战及解决方案 [编辑]
| 此章節的中立性有争议,可能帶有明顯的個人觀點。 |
对程序员而言,开发Ajax应用最头痛的问题莫过于以下几点:
- Ajax在本质上是一个浏览器端的技术,首先面临无可避免的第一个问题即是浏览器的兼容性问题。各家浏览器对于JavaScript/DOM/CSS的支持总有部分不太相同或是有Bug,甚至同一浏览器的各个版本间对于JavaScript/DOM/CSS的支持也有可能部分不一样。这导致程序员在写Ajax应用时花大部分的时间在调试浏览器的兼容性而非在应用程序本身。因此,目前大部分的Ajax链接库或开发框架大多以js链接库的形式存在,以定义更高阶的JavaScript API 、JavaScript对象(模板)、或者JavaScript Widgets来解决此问题。如prototype.js。
- Ajax技术之主要目的在于局部交换客户端及服务器之间的数据。如同传统之主从架构,无可避免的会有部分的业务逻辑会实现在客户端,或部分在客户端部分在服务器。由于业务逻辑可能分散在客户端及服务器,且以不同之程序语言实现,这导致Ajax应用程序极难维护。如有使用者接口或业务逻辑之更动需求,再加上前一个JavaScript/DOM/CSS之兼容性问题,Ajax应用往往变成程序员的梦魇。针对业务逻辑分散的问题,Ajax开发框架大致可分为两类:
- 将业务逻辑及表现层放在浏览器,数据层放在服务器:因为所有的程序以JavaScript执行在客户端,只有需要数据时才向服务器要求服务,此法又称为胖客户端(fat client)架构。服务器在此架构下通常仅用于提供及储存数据。此法的好处在于程序员可以充分利用JavaScript搭配业务逻辑来做出特殊的使用者接口,以符合终端使用者的要求。但是问题也不少,主因在第一,JavaScript语言本身之能力可能不足以处理复杂的业务逻辑。第二,JavaScript的执行效能一向不好。第三,JavaScript存取服务器数据,仍需适当的服务器端程序之配合。第四,浏览器兼容性的问题又出现。有些Ajax开发框架如DWR企图以自动生成JavaScript之方式来避免兼容的问题,并开立通道使得JavaScript可以直接叫用服务器端的Java程序来简化数据的存取。但是前述第一及第二两个问题仍然存在,程序员必须费相当的力气才能达到应用程序之规格要求,或可能根本无法达到要求。
- 将表现层、业务逻辑、及数据层放在服务器,浏览器仅有使用者接口引擎(User Interface engine);此法又称为瘦客户端(thin client)架构,或中心服务器(server-centric)架构。浏览器的使用者接口引擎仅用于反映服务器的表现层以及传达使用者的输入回到服务器的表现层。由浏览器所触发之事件亦送回服务器处理,根据业务逻辑来更新表现层,然后反映回浏览器。因为所有应用程序完全在服务器执行,数据及表现层皆可直接存取,程序员只需使用服务器端相对较成熟之程序语言(如Java语言)即可,不需再学习JavaScript/DOM/CSS,在开发应用程序时相对容易。缺点在于使用者接口引擎以及表现层通常以标准组件的形式存在,如需要特殊组件(使用者接口)时,往往须待原框架之开发者提供,缓不济急。如开源码Ajax开发框架ZK目前支持XUL及XHTML组件,尚无XAML之支持。
Ajax是以异步的方式向服务器提交需求。对服务器而言,其与传统的提交窗体需求并无不同,而且由于是以异步之方式提交,如果同时有多个Ajax需求及窗体提交需求,将无法保证哪一个需求先获得服务器的响应。这会造成应用程序典型的多进程(process)或多线程(thread)的竞争(racing)问题。程序员因此必须自行处理或在JavaScript里面动手脚以避免这类竞争问题的发生(如Ajax需求未响应之前,先disable送出按钮),这又不必要的增加了程序员的负担。目前已知有自动处理此问题之开发框架似乎只有ZK。[來源請求]
參考 [编辑]
- ^ (英文)Ajax: 網頁應用程式的新方法 — Jesse James Garrett,最近存取日2007年11月7日
- ^ (英文)微軟 XML Parser (MSXML) 版本列表,最近存取日2007年11月7日
- ^ (英文)Web设计10大错误(1999年) — Jakob Nielsen 著
- ^ (英文)Remote Scripting with AJAX, Part 2
- ^ (英文)延遲必死:預讀資料以降低延遲 — JonathanBoutelle.com
- ^ (英文)不可靠網路下的非同步要求 — Harry Fuecks 著,2005年2月
- ^ (英文)小朋友們聽著, AJAX 不怎麼酷 — Marcus Baker 著,2005年6月3日
- ^ (英文)Opera 9 支援的網頁規格 — XSLT, XPath, and XSL-FO 部分論及不支持 XSL-FO 與 XSLT,最近存取日2007年11月7日
9.(英文) Ajax: A new approach to web applications --JJ Garrett - 2005年
參見 [编辑]
- Google Web Toolkit 是一個前端使用JavaScript,後端使用Java的AJAX framework,提供WYSIWYG設計介面。
- jQuery 用于简化AJAX开发的Javascript函式庫。
- Prototype AJAX函式庫。
- Yahoo! UI Library is a set of utilities and controls, written in JavaScript, for building richly interactive web applications using techniques such as DOM scripting, DHTML and AJAX.
- Xajax 知名的開源碼開發AJAX用PHP函式庫。
- ZK,开放源代码AJAX/XUL框架,JAVA專用。
- ASP.NET AJAX,由微軟專為 ASP.NET 應用程式所開發的 AJAX 基礎架構。
- web 2.0,一种新的互联网概念
- 推送技术,一种服务端主动通知用户的技术
外部连接 [编辑]
工具 [编辑]
- ASP.NET AJAX Extension(開發階段時代號 Atlas),微軟AJAX工具箱。
- jQuery,開源JS框架,寫得更少,做得更多。
- Dojo工具箱,AJAX/DHTML工具箱。
- Prototype,開放源代碼框架。
- Buffalo Web Remoting (based on prototype)
- openrico JS UI component (based on prototype)
- PHPRPC,開放源代碼多語言支持的跨平台的安全的 Web 遠程過程調用框架,讓 Ajax 編程更容易。
- Sajax,簡單AJAX工具箱
- Rialto,Rich Internet AppLication TOolkit.
- MochiKit 一個自稱AJAX的輕量級js庫,支持Json。
- OpenLaszlo 原本專注在Flash 作為表現層的Laszlo 將方向轉至AJAX。
- script.aculo.us 為Ruby on Rails量身打造的AJAX函式庫,跨平台支援。
- Rico 知名的開源碼的AJAX函式庫,跨平台支援。
- DWR Web Remoting
- qooxdoo JS UI component (C/S Style)
- jsLINB 完全OOP,帶有線程模擬的ajax RIA框架。
- GWT Google 開源框架。
- Quicknet 一個能提供安全資料傳輸的 AJAX 系統架構。
网站 [编辑]
图书 [编辑]
- 《Ajax基础教程》,Foundations Of Ajax 中文版,人民邮电出版社图灵公司出版。ISBN 7-115-14481-8
- 《Ajax实战》,Ajax in Action 中文版,人民邮电出版社图灵公司出版。ISBN 7-115-14717-5
- 《Ajax高级程序设计》(第二版),Professional Ajax,人民邮电出版社图灵公司出版。
- 《Head First Ajax》O'Reilly出版社
- 《Ajax 實戰手冊》碁峰 ISBN 986-181-036-6
- 《Ajax技術手冊》碁峰 ISBN 986-181-019-6
其他资源 [编辑]
- AJAX 上手篇,AJAX 上手篇
- 掌握 Ajax,掌握 Ajax
- Ajax插件(英文),Hot!Ajax
- [1],jQuery类库新手使用指南之AJAX方法- 第一部分
- [2],jQuery类库新手使用指南之AJAX方法- 第二部分
- [3],jQuery类库新手使用指南之AJAX方法- 第三部分
- [4],jQuery类库新手使用指南之AJAX方法- 第四部分
|
||||||||||||||||||||||||||