XMLHttpRequest 对象是AJAX功能的核心,要开发AJAX程序必须从了解XMLHttpRequest 对象开始。html
了解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 对象的方法:dom
建立兼容多浏览器的 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事件句柄吧。async
方法:函数
open() 说明:初始化 HTTP 请求参数,例如 URL 和 HTTP 方法,可是并不发送请求。
abort() 说明:取消当前响应,关闭链接而且结束任何未决的网络活动。
getAllResponseHeaders() 说明:把 HTTP 响应头部做为未解析的字符串返回。
getResponseHeader() 说明:返回指定的 HTTP 响应头部的值。
send() 说明:发送 HTTP 请求,使用传递给 open() 方法的参数,以及传递给该方法的可选请求体。
setRequestHeader() 说明:向一个打开但未发送的请求设置或添加一个 HTTP 请求。
属性:网站
readyState 说明:HTTP 请求的状态。
responseText 说明:目前为止为服务器接收到的响应体(不包括头部),或者若是尚未接收到数据的话,就是空字符串。
responseXML 说明:对请求的响应,解析为 XML 并做为 Document 对象返回。
status 说
详解AJAX核心—XMLHttpRequest 对象第2部分:
明:由服务器返回的 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(null);
就能够了。好了,发送了,那怎么处理返回的结果呢,这个时候就用到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 能处理三、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(){
详解AJAX核心—XMLHttpRequest 对象第3部分:
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(null);
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,可是若是咱们对基础的东西有很好的理解,那这些库报告错误,或者出现问题咱们能够很好很快的知道错在哪里,更快的作出改变使程序正常运行。