详解AJAX核心中的XMLHttpRequest对象
XMLHttpRequest 对象是AJAX功能的核心 要开发AJAX程序必须从了解XMLHttpRequest 对象开始
了解XMLHttpRequest 对象就先从创建XMLHttpRequest 对象开始 在不同的浏览器中创建XMLHttpRequest 对象使用不同的方法
先看看IE创建XMLHttpRequest 对象的方法(方法 )
var xml = new ActiveXObject( Msxml XMLHTTP );
//使用较新版本的 IE 创建 IE 兼容的对象(Msxml XMLHTTP)
var xml = new ActiveXObject( Microsoft XMLHTTP );
//使用较老版本的 IE 创建 IE 兼容的对(Microsoft XMLHTTP)
而 Mozilla Opera Safari 和大部分非IE的浏览器都使用下面这种方法(方法 )创建XMLHttpRequest 对象
var xml = new XMLHttpRequest();
实际上Internet Explorer 使用了一个名为 XMLHttp 的对象 而不是 XMLHttpRequest 对象 而 Mozilla Opera Safari 和 大部分非 Microsoft 浏览器都使用的是后者(下文统称 XMLHttpRequest 对象) IE 开始也开始使用XMLHttpRequest 对象了
在创建 XMLHttpRequest 对象的时候如果不同的浏览器使用了不正确的方法浏览器都将会报错 并且无法使用该对象 所以我们需要一种可以兼容不同浏览器的创建XMLHttpRequest 对象的方法
创建兼容多浏览器的 XMLHttpRequest 对象方法
var xml = false; //创建一个新变量 request 并赋值 false 使用 false 作为判断条件 它表示还没有创建 XMLHttpRequest 对象 function CreateXMLHttp(){try{xml = new XMLHttpRequest(); //尝试创建 XMLHttpRequest 对象 除 IE 外的浏览器都支持这个方法 }catch (e){try{xml = new ActiveXObject( Msxml XMLHTTP ); //使用较新版本的 IE 创建 IE 兼容的对象(Msxml XMLHTTP)}catch (e){try{xml = new ActiveXObject( Microsoft XMLHTTP ); //使用较老版本的 IE 创建 IE 兼容的对象(Microsoft XMLHTTP) }catch (failed){xml = false; //如果失败则保证 request 的值仍然为 false }}}return xml;}判断是否创建成功就很简单了
if (!xml){//创建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 xml = CreateXMLHttp();
创建好XMLHttpRequest 对象了 那我们要送请求到哪个网站呢 就选择博客园首页的RSS吧 那怎么设置我要请求的网站地址呢 使用open()方法
open(method url async username password)
该方法有 个参数 具体什么意思可以看这里 我们用的就是这个了
xmlHttp open( get true);
get参数表示用get方法 第二个自然就是目标地址 博客园首页 第三个就是表示是否异步了 我们当然使用true了 具体的参数说明还都可以到上面看了
好了 目标定好了 怎么发送呢 用send()方法?
send(body) send()方法只有一个参数 表示DOM对象 这个DOM对象需要说明的内容很多 下次说 今天我们只要写
xml send();就可以了 好了 发送了 那怎么处理返回的结果呢 这个时候就用到XMLHttpRequest 对象最重要的东西了 那就是onreadystatechange事件句柄 什么意思呢 那就需要说明一下XMLHttpRequest 对象的readyState了 readyState有 种状态 分别用数字的 到 来表示
状态 名称 描述 Uninitialized 初始化状态 XMLHttpRequest 对象已创建(未调用open()之前)或已被 abort() 方法重置 Open open() 方法已调用 但是 send() 方法未调用 请求还没有被发送 Sent Send() 方法已调用 HTTP 请求已发送到 Web 服务器 未接收到响应 Receiving 所有响应头部都已经接收到 响应体开始接收但未完成 Loaded HTTP 响应已经完全接收
但是需要注意的是 onreadystatechange事件句柄不同的浏览器能处理的状态并不一致 IE和FireFox能处理 到 而Safari能处理 到 的状态 Opera 能处理 两中状态 的状态基本没什么用 因为创建了XMLHttpRequest 对象后都会马上调用open() 方法 这时候状态就变成 了 当然除非你要判断对象是否已经被 abort() 取消 可是这样的情况依然很少 大部分情况下判断是不是 (已经接受完成)这个状态就够了
好了 明白了readyState有 种状态了 那处理返回结果就是看状态变更到不同的状态我们做不同的处理就可以了 怎么告诉XMLHttpRequest 对象状态变化时让谁来处理这个变化呢 有两种写法 一种是用匿名方法 另一种是指定方法 其实只是不同的写发 作用都一样 看下代码
xml onReadyStateChange = function (){//处理状态变化的代码}//或者xml onReadyStateChange = getResult;function getResult(){///处理状态变化的代码}
顺便说一下 句柄的名称比较长 可以这样记忆 on ReadyState Change 表示在读取状态改变时请求发送了 也指定处理方法了 怎么获取返回的内容呢 有responseText和responseXML两个属性可供使用 responseXML是返回对象 需要再解析 后面再说 这里先用responseText 看看返回什么
alert(xml responseText); //看看是不是返回了首页的HTML代码啊 是你就成功了
整个过程是 创建XMLHttpRequest 对象 > 指定发送地址及发送方法 > 发送请求 > 指定处理方法并处理返回结果 但是需要注意 我们正常的思路理解是这样的 可是onreadystatechange事件句柄指定处理方法需要在发送之前就指定好 否则无法处理状态变化事件
所以我们应该按照下面的流程来记忆 创建XMLHttpRequest 对象 > 指定发送地址及发送方法 > 指定状态变化处理方法 > 发送请求 请求发送后状态变化了就会自动调用指定的处理方法 好了 看看完成的代码吧
完成的代码
var xml = false; //创建一个新变量 request 并赋值 false 使用 false 作为判断条件 它表示还没有创建 XMLHttpRequest 对象 function CreateXMLHttp(){try{xml = new XMLHttpRequest(); //尝试创建 XMLHttpRequest 对象 除 IE 外的浏览器都支持这个方法 }catch (e){try{xml = new ActiveXObject( Msxml XMLHTTP ); //使用较新版本的 IE 创建 IE 兼容的对象(Msxml XMLHTTP)}catch (e){try{xml = new ActiveXObject( Microsoft XMLHTTP ); //使用较老版本的 IE 创建 IE 兼容的对象(Microsoft XMLHTTP) }catch (failed){xml = false; //如果失败则保证 request 的值仍然为 false }}}return xml;}xml = CreateXMLHttp();xml open( get true);xml onReadyStateChange = getResult;xml send();function getResult(){if(xml readyState == ){alert(xml responseText);}}
看似一切都OK了 可是有没有想过 如果HTML代码在网络传输过程中出错了 或者我们指定的地址失效会怎么样呢 这个时候就需要用到status属性 即由服务器返回的 HTTP 状态代码 xml status 等于 时表示传输过程完整没有错误 具体的HTTP状态代码什么意思可以到W C组织网站上看看 地址l
把getResult()方法写成下面这样我觉的就真的OK了
function getResult(){if(xml readyState == && xml status == ){alert(xml responseText);}}
lishixinzhi/Article/program/Java/JSP/201311/19144