HTML教程 CSS教程 DHTML教程 Dreamweaver FrontPagesJavascript 正则表达式专题
返回首页

详解Ajax中XMLHttp请求及利弊分析

时间:2010-07-12 09:06来源: 作者:编程狂 点击:
请注意此处的第一个参数,也就是请求类型,即使在技术层面要求请求类型全部为大写字符,但此处使用小写也是没关系的。 接下来,你需要定义一个onreadystatechange事件处理函数,xml(标准化越

请注意此处的第一个参数,也就是请求类型,即使在技术层面要求请求类型全部为大写字符,但此处使用小写也是没关系的。 接下来,你需要定义一个onreadystatechange事件处理函数,xmlHttp对象有一个名为readyState的属性,当发送请求或收到响应时,此属性值会改变。

copyright lyttzx.com

以下是属性readyState可取的五个值:

0(未初始化):对象已创建,但还未调用open()方法。
1(正在加载):已调用open()方法,但请求还未发送。
2(已加载):请求已经发送。
3(相交互):已接收到一部分响应。
4(完成):所有数据已收到,连接已经关闭。

在每次readystate属性值变化时,都会引发readystatechange事件,并调用onreadystatechange事件处理函数。因为各浏览器实现之间的差异,在跨浏览器开发时唯一可靠的readystate值为0、1和4。在大多数情况下,当请求被返回时,只需检查此值是否为4:
  lyttzx.com

var oxml(标准化越来越近了);
Http = zxml(标准化越来越近了);
Http.createRequest();
 
Http.open("get", "info.txt", true);
 
Http.onreadystatechange = function () {
if (Http.readyState == 4) { alert("得到响应!"); }
};
内容来自泠云天天在线
最后一步是调用send()方法,实际上是由它来发送请求的。这个方法只接受单一的参数——一个代表请求体的字符串。如果请求不需要一个请求体(比如说:GET请求就不需要),就必须传递给它一个null值:

 
var
Http =
Http.createRequest();
 
Http.open("get", "info.txt", true);
Http.onreadystatechange = function () {
if (Http.readyState == 4) { alert("得到响应!"); }
}; Http.send(null);
泠云工作室
大体流程是,发送请求后,当收到响应,将会显示一个提示框,但仅仅显示一条请求已被接收的消息是远远不够的,xmlHttp的真正威力在于,不但可以让你访问到返回的数据,还可以访问到响应状态和响应头部信息。
为得到从请求返回的数据,可使用responseText和responsexml属性;属性responseText返回一个包含请求体的字符串,而responsexml则是一个xml文档对象,只用于返回数据中包含有text/xml内容的情况。因此,为取得info.txt中的文本,必须进行以下调用:

 
var sData = Http.responseText;
本文来自泠云天天在线
注意,只有文件存在,并且没有错误发生时,才会返回info.txt中相应的文本。但如果info.txt文件不存在,则responseText将返回一个服务器404错误信息,幸好,还有一个方法可以确定是否有错误发生。
属性status中包含有响应返回的HTTP状态代码,而statusText是关于状态的文本描述(如:OK或者Not Found)。使用这两个属性,你可以确认所接收到的数据是实际想要的数据,或告诉用户为什么数据没有收到:

 
if (Http.status == 200) {
alert("返回的数据为:" + Http.responseText;
} else {
alert("错误为:" + Http.statusText;
}
泠云工作室
通常来说,必须保证响应的status(状态码)为200,以表明请求完全成功,有时即使服务端有错误发生,属性readState仍会被设为4,所以仅仅检查此值还是不够的。在这个例子中,如果status值为200,将显示responseText的内容,否则,就显示一个出错信息。
在Opera中,仍未实现statusText属性,在其他的浏览器上,有时还会返回一个不精确的描述信息,所以,不能仅仅依靠statusText来判断是否有错误发生。
正如前面所提到的,我们还可以访问到响应头部信息,在此使用getResponseHeader()方法,并传递给它一个你想要的头部名,来得到一个特定的头部值。而当中最有用的一个响应头部信息是Content-Type,它将告诉你正在被发送的数据类型:

 
var sContentType =
Http.getResponseHeader("Content-Type");
if (sContentType == "text/xml") {
alert("接收到的内容为xml!");
} else if (sContentType == "text/plain") {
alert("接收到的内容为纯文本!"); } else { alert("无法判断的内容!");
}
泠云工作室
这段代码检查响应中的内容类型,并用一个对话框来显示返回的数据类型。一般来说,从服务器接收到的数据,只会是xml(内容类型为text/xml)或者纯文本(内容类型为text/plain),因为这些类型最容易与Javascript协同工作。
如果你更想看到从服务器返回的所有头部信息,那么可用getAllResponseHeaders()方法,其将返回一个包含所有头部信息的字符串,由换行符(Javascript中表示为\n)或回车换行符(Javascript中表示为\r\n)进行分隔,可以像如下所示对个别的头部信息进行处理:

 
var sHeaders =
Http.getAllResponseHeaders();
var aHeaders = sHeaders.split(/\r?\n/);
for (var i=0; i < aHeaders.length; i++) { alert(aHeaders[i]); }
copyright lyttzx.com
这个例子使用Javascript的split()字符串方法,并传递给它一个正则表达式(由它来匹配回车换行或仅仅是换行),把包含头部信息的字符串分离到一个数组中。现在,你可以遍历这些头部信息,做一些想做的事了。别忘了,数组aHeaders中每一个字符串的形式为:(头部名:值)。
在头部信息被发送出去之前,也可以对头部信息进行修改。你也许想要表明你正在发送的数据内容是什么类型,或者你想要发送一些服务器可能需要与请求一并处理的其他额外数据,要这样做的话,在调用send()之前,必须先调用setRequestHeader()方法:

 
var
Http = Http.createRequest();
Http.open("get", "info.txt", true);
Http.onreadystatechange = function () {
if (Http.readyState == 4) { alert("得到响应!"); }
};
Http.setRequestHeader("myheader", "myvalue");
Http.send(null);
泠云工作室
在以上代码中,一个名为myheader的头部名在发送之前,被加入到请求中,在此是以myheader:myvalue的形式加入到默认头部信息中的。
由此,就可以处理异步请求了,而异步请求对大多数情况都是适用的。发送异步请求意味着你不需要分配一个onreadstatechange事件处理函数,因为当send()方法返回时,就会收到响应。所以,代码可以这样写:
var Http = Http.createRequest();
Http.open("get", "info.txt", false);
Http.send(null);
if (Http.status == 200) {
alert("返回的数据为:" + Http.responseText;
} else {
alert("错误为:" + Http.statusText;
}
内容来自泠云天天在线
异步发送请求(设置open()的第三个参数为false),可以使你在调用send()之后,就立即开始评估响应,如果你想让用户等待响应,或者你只期望收到一小点数据(例如,小于1k),那就另当别论了,但在一般数据量或大数据量的情况中,最好都使用异步调用。
(责任编辑:泠云)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名:密码: 验证码:点击我更换图片
发布者资料
编程狂 查看详细资料 发送留言 加为好友 用户等级:高级会员 注册时间:2009-10-07 08:10 最后登录:2010-09-09 15:09