掌握WEB2.0的核心——AJAX的客户端基础应用
编程爱好者
最近互联网上比较火热的话题当然是关于WEB2.0的应用,其中AJAX又是WEB2.0的核心之一,此技术最常见的应用就是大名鼎鼎的GMail。AJAX是Asynchronous JavaScript and XML 的缩写,它并不是一门新的语言或技术,它实际上是几项技术按一定的方式组合在一起在共同协作中发挥各自的作用,它包括:
●使用XHTML和CSS标准化呈现;
●使用DOM实现动态显示和交互;
●使用XML和XSLT进行数据交换与处理;
●使用XMLHttpRequest进行异步数据读取;
●使用JavaScript绑定和处理所有数据。
Ajax的工作原理相当于在用户端和服务器之间加了—个中间层,使用户操作与服务器响应异步化。这样把以前的一些服务器负担的工作转嫁到客户端,利用客户端闲置的处理能力来处理一些工作,减轻服务器和带宽的负担,从而达到节约ISP的空间及带宽租用成本的目的。
我们以两个验证通行证账号是否存在的例子来讲述AJAX在实际中的应用:
(1) 用文本字符串的方式返回服务器的响应来验证网易通行证账号是否存在;
(2) 以XMLDocument对象方式返回响应来验证金山通行证账号是否存在。
一、创建XMLHttpRequest 类
首先,我们需要用JavaScript来创建XMLHttpRequest 类向服务器发送一个HTTP请求, XMLHttpRequest 类首先由Internet Explorer以ActiveX对象引入,被称为XMLHTTP。 后来Mozilla﹑Netscape﹑Safari 和其他浏览器也提供了XMLHttpRequest类,不过它们创建XMLHttpRequest类的方法不同。
对于Internet Explorer浏览器,创建XMLHttpRequest 方法如下:
xmlhttp_request = new ActiveXObject("Msxml3.XMLHTTP");
xmlhttp_request = new ActiveXObject("Msxml2.XMLHTTP");
xmlhttp _request = new ActiveXObject("Microsoft.XMLHTTP");
由于在不同Internet Explorer浏览器中XMLHTTP版本可能不一致,为了更好地兼容不同版本的Internet Explorer浏览器,因此我们需要根据不同版本的Internet Explorer浏览器来创建XMLHttpRequest类。
对于Mozilla﹑Netscape﹑Safari等浏览器,创建XMLHttpRequest 方法如下:
xmlhttp_request = new XMLHttpRequest();
如果服务器的响应没有XML mime-type header,某些Mozilla浏览器可能无法正常工作。 为了解决这个问题,如果服务器响应的header不是text/xml,可以调用其它方法修改该header。
xmlhttp_request = new XMLHttpRequest();
xmlhttp_request.overrideMimeType('text/xml');
在实际应用中,为了兼容多种不同版本的浏览器,一般将创建XMLHttpRequest类的方法写成如下形式:
if (window.XMLHttpRequest) {
xmlhttp_request = new XMLHttpRequest();
if (xmlhttp_request.overrideMimeType) {
xmlhttp_request.overrideMimeType('text/xml'); }
} else if (window.ActiveXObject) {
try {
xmlhttp_request = new ActiveXObject("Msxml3.XMLHTTP");
} catch (e) {
try {
xmlhttp_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {} } } }
二、发送请求与接受响应
在定义了如何处理响应后,就要发送请求了。可以调用HTTP请求类的open()和send()方法,如下所示:
xmlhttp_request.open('GET', URL, true);
xmlhttp_request.send(null);
open()的第一个参数是HTTP请求方式—GET,POST或任何服务器所支持的你想调用的方式。 按照HTTP规范,该参数要大写;否则,某些浏览器(如Firefox)可能无法处理请求。
第二个参数是请求页面的URL。
第三个参数设置请求是否为异步模式。如果是TRUE,JavaScript函数将继续执行,而不等待服务器响应。这就是“AJAX”中的“A”。
用JavaScript来创建XMLHttpRequest类向服务器发送一个HTTP请求后,接下来要决定当收到服务器的响应后,需要做什么。这需要告诉HTTP请求对象用哪一个JavaScript函数处理这个响应。可以将对象的onreadystatechange属性设置为要使用的JavaScript的函数名,如下所示:
xmlhttp_request.onreadystatechange =FunctionName;
FunctionName是用JavaScript创建的函数名,注意不要写成FunctionName(),当然我们也可以直接将JavaScript代码创建在onreadystatechange之后,例如:
xmlhttp_request.onreadystatechange = function(){// JavaScript代码段};
在这个函数中。首先要检查请求的状态。只有当一个完整的服务器响应已经收到了,函数才可以处理该响应。XMLHttpRequest 提供了readyState属性来对服务器响应进行判断。
readyState的取值如下:
0 (未初始化)
1 (正在装载)
2 (装载完毕)
3 (交互中)
4 (完成)
所以只有当readyState=4时,一个完整的服务器响应已经收到了,函数才可以处理该响应。具体代码如下:
if (http_request.readyState == 4) {
// 收到完整的服务器响应
} else {
// 没有收到完整的服务器响应 }
当readyState=4时,一个完整的服务器响应已经收到了,接着,函数会检查HTTP服务器响应的状态值。完整的状态取值可参见W3C文档。当HTTP服务器响应的值为200时,表示状态正常。
在检查完请求的状态值和响应的HTTP状态值后,就可以处理从服务器得到的数据了。有两种方式可以得到这些数据:
(1) 以文本字符串的方式返回服务器的响应
(2) 以XMLDocument对象方式返回响应。
三、程序实例
实例一: 用文本字符串的方式返回服务器的响应来验证网易通行证账号是否存在(如图)。

首先,我们登录网易通行证注册页面,可以看到检测用户名是否存在是将用户名提交给checkssn.jsp页面进行判断,格式为:
http://reg.163.com/register/checkssn.jsp?username=用户名
根据上面讲到的方法,我们可以利用AJAX技术对网易通行证用户名进行检测:
第一步:新建一个基于Xhtml标准的网页,在
区域插入Javascript函数如下:<script type="text/javascript" language="javascript">
var xmlhttp_request = false;
function IDRequest(n) {//定义收到服务器的响应后需要执行的JavaScript函数
url=n+document.getElementById('163id').value;//定义网址参数
xmlhttp_request = false;//定义为异步传输模式
if (window.XMLHttpRequest) { // Mozilla, Safari等浏览器时创建XMLHTTP类
xmlhttp_request = new XMLHttpRequest();
if (xmlhttp_request.overrideMimeType) {
xmlhttp_request.overrideMimeType('text/xml'); }
} else if (window.ActiveXObject) {//IE浏览器时创建XMLHTTP类
try {
xmlhttp_request = new ActiveXObject("Msxml3.XMLHTTP");
} catch (e) {
try {
xmlhttp_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {} } } }
if (!xmlhttp_request) {//不能创建XMLHTTP类时返回
return false; }
xmlhttp_request.onreadystatechange = doContents;//调用doContents函数
xmlhttp_request.open('GET', url, true);
xmlhttp_request.send(null); }
function doContents() {
if (xmlhttp_request.readyState == 4) {// 收到完整的服务器响应
if (xmlhttp_request.status == 200) {//HTTP服务器响应的值OK
document.getElementById('message').innerHTML = xmlhttp_request.responseText;
//将服务器返回的字符串写到页面中ID为message的区域
} else {
alert(http_request.status); } } }
</script>
在<body>区域建立一个文本框,id为163id
<input type="text" id="163id" onprope
rtychange="IDRequest('http://reg.163.com/register/checkssn.jsp?username=')" />
再建一个id为message的空白区域用来显示返回字符串:
<div id="message"></div>
这样,一个基于AJAX技术的用户名检测页面就做好了,这个页面将返回服务器响应生成页面的所有字符串,当然还可以对返回的字符串进行一些操作,便于应用到不同的需要当中。
实例二: 以XMLDocument对象方式返回响应来验证金山通行证账号是否存在。
在上面的例子中,当服务器对HTTP请求的响应被收到后,我们会调用请求对象的responseText属性。该属性包含了服务器返回响应文件的内容。现在我们以XMLDocument对象方式返回响应,此时将不再需要reponseText属性而使用responseXML属性。
首先登录金山通行证注册页面,我们发现金山通行证用户名的检测方式为:
http://pass.kingsoft.com/ksgweb/jsp/login/uid.jsp?uid=用户名,并且返回XML数据:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<response>
<method>isExistedUid</method>
<result>-2</result>
</response>
当result值为-1时表示此用户名已被注册,当result值为-2时表示此用户名尚未注册,因此通过对result值的判断可以知道用户名是否被注册。
对上例代码进行修改:
首先找到document.getElementById('message').innerHTML = xmlhttp_request.responseText;
改为:
var response = xmlhttp_request.responseXML.documentElement;
var result = response.getElementsByTagName('result')[0].firstChild.data;//返回resu
lt节点数据
if(result ==-2){
document.getElementById('message').innerHTML = "用户名"+document.getElem
entById('163id').value+"尚未注册"; }
else if(result ==-1){
document.getElementById('message').innerHTML = "对不起,用户名"+document.getElementById('163id').value+"已经注册"; }
通过以上两个实例说明了AJAX的客户端基础应用,采用的是网易和金山现成的服务器端程序,当然为了开发适合自己页面的程序,还需要对自己编写服务器端程序。
四、学习资源
虽然网络上已经有大量的相关资源,但是为了打好基础,认真读上几本书还是很有必要的。下面是笔者看过并推荐的几本书:
1.《XHTML 教程》
作者:Chelsea Valentine, Chris Minnick
New Riders 原版,人民邮电出版社出版
2.《JavaScript 权威指南第四版》
作者:David Flanagan
O'Reilly 原版,中国电力出版社中文版
3.《XML 高级编程》
作者:Didier Martin等
Wrox 原版,机械工业出版社出版
4.《网站重构》
作者:Jeffrey Zeldman
New Riders 原版,电子工业出版社出版