详解AJAX核心中的XMLHttpRequest对象-阿里云开发者社区

开发者社区> 科技小先锋> 正文

详解AJAX核心中的XMLHttpRequest对象

简介:
+关注继续查看
XMLHttpRequest 对象是AJAX功能的核心,要开发AJAX程序必须从了解XMLHttpRequest 对象开始。
    了解XMLHttpRequest 对象就先从创建XMLHttpRequest 对象开始,在不同的浏览器中创建XMLHttpRequest 对象使用不同的方法:
    先看看IE创建XMLHttpRequest 对象的方法(方法1):
 
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");  
//使用较新版本的 IE 创建 IE 兼容的对象(Msxml2.XMLHTTP)
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
//使用较老版本的 IE 创建 IE 兼容的对(Microsoft.XMLHTTP)

    而 Mozilla、Opera、Safari 和大部分非IE的浏览器都使用下面这种方法(方法2)创建XMLHttpRequest 对象:
 
var xmlhttp = new XMLHttpRequest();
    实际上Internet Explorer 使用了一个名为 XMLHttp 的对象,而不是 XMLHttpRequest 对象,而 Mozilla、Opera、Safari 和 大部分非 Microsoft 浏览器都使用的是后者(下文统称 XMLHttpRequest 对象)。IE7开始也开始使用XMLHttpRequest 对象了。
    在创建 XMLHttpRequest 对象的时候如果不同的浏览器使用了不正确的方法浏览器都将会报错,并且无法使用该对象。所以我们需要一种可以兼容不同浏览器的创建XMLHttpRequest 对象的方法:
    创建兼容多浏览器的 XMLHttpRequest 对象方法
var xmlhttp = false//创建一个新变量 request 并赋值 false。使用 false 作为判断条件,它表示还没有创建 XMLHttpRequest 对象。    
function CreateXMLHttp(){try{xmlhttp = new XMLHttpRequest();    //尝试创建 XMLHttpRequest 对象,除 IE 外的浏览器都支持这个方法。 
}catch (e){ 
try
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");    //使用较新版本的 IE 创建 IE 兼容的对象(Msxml2.XMLHTTP) 
}catch (e){ 
try
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); //使用较老版本的 IE 创建 IE 兼容的对象(Microsoft.XMLHTTP)。 
}catch (failed){ 
xmlhttp = false;    //如果失败则保证 request 的值仍然为 false。 



return xmlhttp; 
}判断是否创建成功就很简单了 
if (!xmlhttp) 
{//创建XMLHttpRequest 对象失败! 
}else{//创建成功!}
创建好了XMLHttpRequest 对象我们再来看看这个对象的方法、属性以及最重要的onreadystatechange事件句柄吧。
 
    方法:
    open() 说明:初始化 HTTP 请求参数,例如 URL 和 HTTP 方法,但是并不发送请求。
    abort() 说明:取消当前响应,关闭连接并且结束任何未决的网络活动。
    getAllResponseHeaders() 说明:把 HTTP 响应头部作为未解析的字符串返回。
    getResponseHeader() 说明:返回指定的 HTTP 响应头部的值。
    send() 说明:发送 HTTP 请求,使用传递给 open() 方法的参数,以及传递给该方法的可选请求体。
    setRequestHeader() 说明:向一个打开但未发送的请求设置或添加一个 HTTP 请求。
    属性:
    readyState 说明:HTTP 请求的状态。
    responseText 说明:目前为止为服务器接收到的响应体(不包括头部),或者如果还没有接收到数据的话,就是空字符串。
    responseXML 说明:对请求的响应,解析为 XML 并作为 Document 对象返回。
    status 说明:由服务器返回的 HTTP 状态代码。
    statusText 说明:这个属性用名称而不是数字指定了请求的 HTTP 的状态代码。
    onreadystatechange 是每次 readyState 属性改变的时候调用的事件句柄函数。
    下面从发送请求并处理请求结果的过程来理解一下XMLHttpRequest 对象吧。
    发送请求之前自然就是生成一个XMLHttpRequest 对象,代码上面有了就不多写了。
    生成一个XMLHttpRequest 对象
 
var xmlhttp = CreateXMLHttp();
    创建好XMLHttpRequest 对象了,那我们要送请求到哪个网站呢,就选择博客园首页的RSS吧。那怎么设置我要请求的网站地址呢,使用open()方法。
    open(method, url, async, username, password)
    该方法有5个参数,具体什么意思可以看这里:http://www.w3school.com.cn/xmldom/dom_http.asp
我们用的就是这个了。
    xmlHttp.open("get","http://www.cnblogs.com",true);
    get参数表示用get方法,第二个自然就是目标地址,博客园首页,第三个就是表示是否异步了,我们当然使用true了。具体的参数说明还都可以到http://www.w3school.com.cn上面看了。
  好了,目标定好了,怎么发送呢。用send()方法?
    send(body),send()方法只有一个参数,表示DOM对象,这个DOM对象需要说明的内容很多,下次说,今天我们只要写
    xmlhttp.send();就可以了。好了,发送了,那怎么处理返回的结果呢,这个时候就用到XMLHttpRequest 对象最重要的东西了,那就是onreadystatechange事件句柄。什么意思呢,那就需要说明一下XMLHttpRequest 对象的readyState了,readyState有5种状态,分别用数字的 0 到 4 来表示。
 
状态 名称 描述
0 Uninitialized  初始化状态。XMLHttpRequest 对象已创建(未调用open()之前)或已被 abort() 方法重置。
1 Open open() 方法已调用,但是 send() 方法未调用。请求还没有被发送。
2 Sent Send() 方法已调用,HTTP 请求已发送到 Web 服务器。未接收到响应。
3 Receiving 所有响应头部都已经接收到。响应体开始接收但未完成。
4 Loaded HTTP 响应已经完全接收。
    但是需要注意的是,onreadystatechange事件句柄不同的浏览器能处理的状态并不一致,IE和FireFox能处理1到4,而Safari能处理2到4的状态,Opera 能处理3、4两中状态。0的状态基本没什么用,因为创建了XMLHttpRequest 对象后都会马上调用open() 方法,这时候状态就变成1了,当然除非你要判断对象是否已经被 abort() 取消,可是这样的情况依然很少。大部分情况下判断是不是4(已经接受完成)这个状态就够了。
    好了,明白了readyState有5种状态了,那处理返回结果就是看状态变更到不同的状态我们做不同的处理就可以了,怎么告诉XMLHttpRequest 对象状态变化时让谁来处理这个变化呢。有两种写法,一种是用匿名方法,另一种是指定方法,其实只是不同的写发,作用都一样,看下代码:
 
xmlhttp.onReadyStateChange = function (){
//处理状态变化的代码
}
//或者
xmlhttp.onReadyStateChange = getResult;
function getResult(){
///处理状态变化的代码
}
    顺便说一下,句柄的名称比较长,可以这样记忆 on ReadyState Change 表示在读取状态改变时请求发送了,也指定处理方法了,怎么获取返回的内容呢,有responseText和responseXML两个属性可供使用,responseXML是返回对象,需要再解析,后面再说,这里先用responseText,看看返回什么。
    alert(xmlhttp.responseText); //看看是不是返回了首页的HTML代码啊。是你就成功了。
    整个过程是:创建XMLHttpRequest 对象 -> 指定发送地址及发送方法 -> 发送请求 -> 指定处理方法并处理返回结果。但是需要注意,我们正常的思路理解是这样的,可是onreadystatechange事件句柄指定处理方法需要在发送之前就指定好,否则无法处理状态变化事件。
    所以我们应该按照下面的流程来记忆:创建XMLHttpRequest 对象 -> 指定发送地址及发送方法 -> 指定状态变化处理方法 -> 发送请求,请求发送后状态变化了就会自动调用指定的处理方法。
好了,看看完成的代码吧。
    完成的代码
var xmlhttp = false//创建一个新变量 request 并赋值 false。使用 false 作为判断条件,它表示还没有创建 XMLHttpRequest 对象。 
function CreateXMLHttp(){ 
try
xmlhttp = new XMLHttpRequest();    //尝试创建 XMLHttpRequest 对象,除 IE 外的浏览器都支持这个方法。 
}catch (e){ 
try{xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");    //使用较新版本的 IE 创建 IE 兼容的对象(Msxml2.XMLHTTP) 
}catch (e){ 
try
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); //使用较老版本的 IE 创建 IE 兼容的对象(Microsoft.XMLHTTP)。 
}catch (failed){ 
xmlhttp = false;    //如果失败则保证 request 的值仍然为 false。 



return xmlhttp; 

xmlhttp = CreateXMLHttp(); 
xmlhttp.open("get","http://www.cnblogs.com",true); 
xmlhttp.onReadyStateChange = getResult;xmlhttp.send(); 
function getResult(){ 
if(xmlhttp.readyState == 4){alert(xmlhttp.responseText); 

}
 看似一切都OK了,可是有没有想过,如果HTML代码在网络传输过程中出错了,或者我们指定的地址失效会怎么样呢。这个时候就需要用到status属性,即由服务器返回的 HTTP 状态代码。 xmlhttp.status 等于200时表示传输过程完整没有错误。具体的HTTP状态代码什么意思可以到W3C组织网站上看看,地址http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1.1 。
    把getResult()方法写成下面这样我觉的就真的OK了。
 
 function getResult(){
if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
alert(xmlhttp.responseText);
}
}
    好了,一个本来挺简单的东西,被我写的这么多,好象很罗嗦。不过我觉的编程对基础内容的理解很重要,现在很多时候开发AJAX的程序都使用很多JS的库,不需要直接编写这么基础的代码。如使用著名的jQuery,但是如果我们对基础的东西有很好的理解,那这些库报告错误,或者出现问题我们可以很好很快的知道错在哪里,更快的做出改变使程序正常运行。


本文转自sucre03 51CTO博客,原文链接:http://blog.51cto.com/sucre/354162,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
学习记录ES6反射内置对象Proxy与Reflect
工作中遇见了一个这样的需求:网页预览视频文件(格式有两种mp4与wmv)时,mp4格式的采用浏览器自带的video标签进行播放,wmv格式的由于浏览器不支持直接播放,则需要调用定制的wmvH5播放器来播放。 经调研发现wmvH5播放器实际上也是采用video标签进行播放的,只不过是加载、播放、暂停、定位播放等核心功能进行了特殊定制,其他如音量控制、播放状态等都是video自带的。 为了
1434 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
12078 0
关于 OpenGL 中平移矩阵变换与实体对象坐标平移的关系分析结论
关于 OpenGL 中平移矩阵变换与实体对象坐标平移的关系分析结论 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循“署名-非商业用途-保持一致”创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。
644 0
Rtti实现对象的XML持久化
去年我花了很多时间尝试用DELPHI进行基于XML的WEB应用开发。起初的设想是很美好的,但结果做出来的东西很简陋。一部分原因就在于XML到Object之间的数据绑定实现太麻烦(另一部分是因为对XSLT不熟,学习它花了很多时间)。
883 0
.NET对象的XML序列化和反序列化
 序列化的概念 序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了。比如,一个计数器,数值为2,我们可以用字符串“2”表示。如果有个对象,叫做connter,当前值为2,那么可以序列化成“2”,反向的,也可以从“2”得到值为2的计数器实例。
719 0
6967
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载