javascript

位置:IT落伍者 >> javascript >> 浏览文章

详解AJAX核心中的XMLHttpRequest对象


发布日期:2020年07月29日
 
详解AJAX核心中的XMLHttpRequest对象

XMLHttpRequest 对象是AJAX功能的核心要开发AJAX程序必须从了解XMLHttpRequest 对象开始

了解XMLHttpRequest 对象就先从创建XMLHttpRequest 对象开始在不同的浏览器中创建XMLHttpRequest 对象使用不同的方法

先看看IE创建XMLHttpRequest 对象的方法(方法

var xmlhttp = new ActiveXObject(MsxmlXMLHTTP);

//使用较新版本的 IE 创建 IE 兼容的对象(MsxmlXMLHTTP)

var xmlhttp = new ActiveXObject(MicrosoftXMLHTTP);

//使用较老版本的 IE 创建 IE 兼容的对(MicrosoftXMLHTTP)

而 MozillaOperaSafari 和大部分非IE的浏览器都使用下面这种方法(方法)创建XMLHttpRequest 对象

var xmlhttp = new XMLHttpRequest();

实际上Internet Explorer 使用了一个名为 XMLHttp 的对象而不是 XMLHttpRequest 对象而 MozillaOperaSafari 和 大部分非 Microsoft 浏览器都使用的是后者(下文统称 XMLHttpRequest 对象)IE开始也开始使用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(MsxmlXMLHTTP); //使用较新版本的 IE 创建 IE 兼容的对象(MsxmlXMLHTTP)

}

catch (e){

try{

xmlhttp = new ActiveXObject(MicrosoftXMLHTTP); //使用较老版本的 IE 创建 IE 兼容的对象(MicrosoftXMLHTTP)

}

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)

该方法有个参数具体什么意思可以看这里

我们用的就是这个了

xmlHttpopen(gettrue);

get参数表示用get方法第二个自然就是目标地址博客园首页第三个就是表示是否异步了我们当然使用true了具体的参数说明还都可以到上面看了

好了目标定好了怎么发送呢用send()方法?

send(body)send()方法只有一个参数表示DOM对象这个DOM对象需要说明的内容很多下次说今天我们只要写

xmlhttpsend();就可以了好了发送了那怎么处理返回的结果呢这个时候就用到XMLHttpRequest 对象最重要的东西了那就是onreadystatechange事件句柄什么意思呢那就需要说明一下XMLHttpRequest 对象的readyState了readyState有种状态分别用数字的 来表示

状态名称描述Uninitialized初始化状态XMLHttpRequest 对象已创建(未调用open()之前)或已被 abort() 方法重置Openopen() 方法已调用但是 send() 方法未调用请求还没有被发送SentSend() 方法已调用HTTP 请求已发送到 Web 服务器未接收到响应Receiving所有响应头部都已经接收到响应体开始接收但未完成 LoadedHTTP 响应已经完全接收

但是需要注意的是onreadystatechange事件句柄不同的浏览器能处理的状态并不一致IE和FireFox能处理而Safari能处理的状态Opera 能处理两中状态的状态基本没什么用因为创建了XMLHttpRequest 对象后都会马上调用open() 方法这时候状态就变成当然除非你要判断对象是否已经被 abort() 取消可是这样的情况依然很少大部分情况下判断是不是(已经接受完成)这个状态就够了

好了明白了readyState有种状态了那处理返回结果就是看状态变更到不同的状态我们做不同的处理就可以了怎么告诉XMLHttpRequest 对象状态变化时让谁来处理这个变化呢有两种写法一种是用匿名方法另一种是指定方法其实只是不同的写发作用都一样看下代码

xmlhttponReadyStateChange = function (){

//处理状态变化的代码

}

//或者

xmlhttponReadyStateChange = getResult;

function getResult(){

///处理状态变化的代码

}

顺便说一下句柄的名称比较长可以这样记忆 on ReadyState Change 表示在读取状态改变时请求发送了也指定处理方法了怎么获取返回的内容呢有responseText和responseXML两个属性可供使用responseXML是返回对象需要再解析后面再说这里先用responseText看看返回什么

alert(xmlhttpresponseText); //看看是不是返回了首页的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(MsxmlXMLHTTP); //使用较新版本的 IE 创建 IE 兼容的对象(MsxmlXMLHTTP)

}

catch (e){

try{

xmlhttp = new ActiveXObject(MicrosoftXMLHTTP); //使用较老版本的 IE 创建 IE 兼容的对象(MicrosoftXMLHTTP)

}

catch (failed){

xmlhttp = false; //如果失败则保证 request 的值仍然为 false

}

}

}

return xmlhttp;

}

xmlhttp = CreateXMLHttp();

xmlhttpopen(gettrue);

xmlhttponReadyStateChange = getResult;

xmlhttpsend();

function getResult(){

if(xmlhttpreadyState == ){

alert(xmlhttpresponseText);

}

}

看似一切都OK了可是有没有想过如果HTML代码在网络传输过程中出错了或者我们指定的地址失效会怎么样呢这个时候就需要用到status属性即由服务器返回的 HTTP 状态代码 xmlhttpstatus 等于时表示传输过程完整没有错误具体的HTTP状态代码什么意思可以到WC组织网站上看看地址l

把getResult()方法写成下面这样我觉的就真的OK了

function getResult(){

if(xmlhttpreadyState == && xmlhttpstatus == ){

alert(xmlhttpresponseText);

}

}

好了一个本来挺简单的东西被我写的这么多好象很罗嗦不过我觉的编程对基础内容的理解很重要现在很多时候开发AJAX的程序都使用很多JS的库不需要直接编写这么基础的代码如使用着名的jQuery但是如果我们对基础的东西有很好的理解那这些库报告错误或者出现问题我们可以很好很快的知道错在哪里更快的做出改变使程序正常运行

上一篇:简单介绍CSS结合JS的运用

下一篇:JavaScript实现仿Windows关机效果