什么是AJAX?
AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。dy)}4U r$OF4b$oT
Ajax(Asynchronous JavaScript + XML)的定义
基于web标准(standards-based presentation)XHTML+CSS的表示; n g.e9a0DD:x!Ag f
:IVN+[B9J#^&r.bP
使用 DOM(Document Object Model)进行动态显示及交互; !l l j.k7P
使用 XML 和 XSLT 进行数据交换及相关操作; p9kD0S'N,v7h6d
使用 XMLHttpRequest 进行异步数据查询、检索;
h9A3@S|E;w:S,]po,w
使用 JavaScript 将所有的东西绑定在一起。v1R[E8o(O*]
英文参见Ajax的提出者Jesse James Garrett的原文。
R2C^;J0NyZg6AvXw
类似于DHTML或LAMP,AJAX不是指一种单一的技术,而是有机地利用了一系列相关的技术。事实上,一些基于AJAX的“派生/合成”式(derivative/composite)的技术正在出现,如“AFLAX”。 b(s~s` Qd.{ n
)\8Q}L n1I&?t
AJAX的应用使用支持以上技术的web浏览器作为运行平台。这些浏览器目前包括:Mozilla、Firefox、Internet Explorer、Opera、Konqueror及Safari。但是Opera不支持XSL格式对象,也不支持XSLT。qAv(RW)A1fi9\!kb
!Fr5fTh$O
与传统的web应用比较
|r6h*SkZ%`&_.]
传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。 ZUT9|JPY/n T#k
^w\Yl&X6ar
与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。
i3Q/O&M&Z'U3K
Ajax应用程序的优势在于:gn S[1uz E3j
9fz0}|5Kn
1. 通过异步模式,提升了用户体验@9Lf2]&SJDF
'Z:Rs8k_/o.I*n*D6F2~.E
2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用#D A+H#g WjZ'D9[*yY9N
gd#q4DS)]g
3. Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。
5ZLa y[H}'X-C
Ajax的工作原理c%D_^7Ld wS
wMI,ky}U
Ajax的核心是JavaScript对象XmlHttpRequest。该对象在Internet Explorer 5中首次引入,它是一种支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。%d*?h-d;?.Q#c8n
在创建Web站点时,在客户端执行屏幕更新为用户提供了很大的灵活性。下面是使用Ajax可以完成的功能:JjzR#^f5H.h$yw
p*V&K2dp
动态更新购物车的物品总数,无需用户单击Update并等待服务器重新发送整个页面。 6XAzAIA*P)e
g/Ez.{OC1UW
提升站点的性能,这是通过减少从服务器下载的数据量而实现的。例如,在某购物车页面,当更新篮子中的一项物品的数量时,会重新载入整个页面,这必须下载整个页面的数据。如果使用Ajax计算新的总量,服务器只会返回新的总量值,因此所需的带宽仅为原来的百分之一。 消除了每次用户输入时的页面刷新。例如,在Ajax中,如果用户在分页列表上单击Next,则服务器数据只刷新列表而不是整个页面。
;P#ATecx
直接编辑表格数据,而不是要求用户导航到新的页面来编辑数据。对于Ajax,当用户单击Edit时,可以将静态表格刷新为内容可编辑的表格。用户单击Done之后,就可以发出一个Ajax请求来更新服务器,并刷新表格,使其包含静态、只读的数据。 F7aE1viV:H,F't
一切皆有可能!但愿它能够激发您开始开发自己的基于Ajax的站点。然而,在开始之前,让我们介绍一个现有的Web站点,它遵循传统的提交/等待/重新显示的范例,我们还将讨论Ajax如何提升用户体验。5^#VcLmda V
-t@[L xtc_
Ajax的工作原理相当于在用户和服务器之间加了—个中间层,使用户操作与服务器响应异步化。这样把以前的一些服务器负担的工作转嫁到客户端,利于客户端闲置的处理能力来处理,减轻服务器和带宽的负担,从而达到节约ISP的空间及带宽租用成本的目的。mw&w(P#^4lOV
XI'{0Jgl7r
我们以两个验证通行证帐号是否存在的例子来讲述AJAX在实际中的应用:0d+R:SF.[ m
_ cM6CTOO
(1)用文本字符串的方式返回服务器的响应来验证网易通行证帐号是否存在;
N'uQ |GL
(2)以XMLDocument对象方式返回响应来验证金山通行证帐号是否存在;
首先,我们需要用JavaScript来创建XMLHttpRequest 类向服务器发送一个HTTP请求, XMLHttpRequest 类首先由Internet Explorer以ActiveX对象引入,被称为XMLHTTP。 后来Mozilla﹑Netscape﹑Safari 和其他浏览器也提供了XMLHttpRequest类,不过它们创建XMLHttpRequest类的方法不同。
对于Internet Explorer浏览器,创建XMLHttpRequest 方法如下:d-Qg`(K1e
[code]M7[ChC NN^
xmlhttp_request = new ActiveXObject("Msxml2.XMLHTTP.3.0"); //3.0或4.0, 5.0
xmlhttp_request = new ActiveXObject("Msxml2.XMLHTTP"); +t9Q*fy4AX
xmlhttp_request = new ActiveXObject("Microsoft.XMLHTTP");
[/code]H'F2M0~LV
由于在不同Internet Explorer浏览器中XMLHTTP版本可能不一致,为了更好的兼容不同版本的Internet Explorer浏览器,因此我们需要根据不同版本的Internet Explorer浏览器来创建XMLHttpRequest类,上面代码就是根据不同的Internet Explorer浏览器创建XMLHttpRequest类的方法。
对于Mozilla﹑Netscape﹑Safari等浏览器,创建XMLHttpRequest 方法如下:m3P"l|g|[%yR
[code]/y3~}bv1jI$nS ip
xmlhttp_request = new XMLHttpRequest();|l3nl"cw6[J
[/code]
如果服务器的响应没有XML mime-type header,某些Mozilla浏览器可能无法正常工作。 为了解决这个问题,如果服务器响应的header不是text/xml,可以调用其它方法修改该header。 ywbn"L.DT
[code]
xmlhttp_request = new XMLHttpRequest(); uf!N h5u/S/i z
xmlhttp_request.overrideMimeType('text/xml'); C,l[%I-|B
[/code]HDoC6O*u(V
在实际应用中,为了兼容多种不同版本的浏览器,一般将创建XMLHttpRequest类的方法写成如下形式:
[code]sW$n#`;_4d;yYQ
try{ n0ZFU'@3uk*c
if( window.ActiveXObject ){ 2yzc7GS/B
for( var i = 5; i; i-- ){
try{ :cU)e:[zk&i
if( i == 2 ){
xmlhttp_request = new ActiveXObject( "Microsoft.XMLHTTP" ); }^ I~+Kqq+L9Z
else{ OKF SUy
xmlhttp_request = new ActiveXObject( "Msxml2.XMLHTTP." + i + ".0" ); }
xmlhttp_request.setRequestHeader("Content-Type","text/xml");
xmlhttp_request.setRequestHeader("Content-Type","gb2312");
break;} @W_qlz
catch(e){
xmlhttp_request = false; } } } R,ne4ut;\
else if( window.XMLHttpRequest )\[e [$_:C
{ xmlhttp_request = new XMLHttpRequest();
if (xmlhttp_request.overrideMimeType)
{ xmlhttp_request.overrideMimeType('text/xml'); } } }h1la j7}
catch(e){ xmlhttp_request = false; } d@sk4G.s!F&m
[/code]
在定义了如何处理响应后,就要发送请求了。可以调用HTTP请求类的open()和send()方法,如下所示:
[code],]-e P3WYn'R2Bg3[
xmlhttp_request.open('GET', URL, true);
xmlhttp_request.send(null);
[/code]
open()的第一个参数是HTTP请求方式—GET,POST或任何服务器所支持的您想调用的方式。 按照HTTP规范,该参数要大写;否则,某些浏览器(如Firefox)可能无法处理请求。