Ajax技术的核心就是XMLHttpRequest对象(XHR)
Ajax技术是无须刷新页面即可以从服务器取得数据
IE7+、Firefox、Opera、Chrome、Safari 都支持的原生XHR对象,如下创建即可
var xhr = new XMLHttpRequest() 但是都知道低版本的IE浏览器是不想面对的,那么我们要兼容早期的IE,该如何处理?IE5是第一款引入XHR对象的浏览器,是通过MSXML库中的一个ActiveX对象实现的。在IE中有三个不同版本的XHR对象,MSXML2.XMLHttp.6.0、MSXML2.XMLHttp.3.0、MSXML2.XMLHttp function createXHR() { // 判断原生XHR对象是否存在 if (typeof XMLHttpRequest != "undefined") { return new XMLHttpRequest() } else if (typeof ActiveXObject != "undefined") { // 判断ActiveX对象是否存在 // callee 是 arguments 对象的一个属性。它可以用于引用该函数的函数体内当前正在执行的函数。 if (typeof arguments.callee.activeXString != "string") { // 版本数组 var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp"] var i, len // 查找IE中MSXML库中最新版本 for (i = 0, len = versions, length; i < len; i++) { try { // new 一个实例,若成功,则使用当前版本的versions[i] new ActiveXObject(versions[i]) arguments.callee.activeXString = versions[i] break } catch (ex) { //跳过 } } } // 创建当前IE中最新版本的XHR对象 return new ActiveXObject(arguments.callee.activeXString) } else { throw new Error('No XHR object available.') } } //创建xhr对象 var xhr = createXHR()xhr.open()方法; 接受3个参数:请求类型(get、post)、请求的URL路径、表示是否异步发送请求的布尔值
xhr.open('get',localost:3000/userlist,false) 启动一个请求备发送,但open()方法并不会真的发送,要发送特定请求,需要send()方法xhr.send() 接受一个参数,作为请求主体发送的数据。若不需要发送数据,则传入null
xhr.send(null) 调用send()之后,请求就会被分派到服务器;收到响应后,响应的数据会自动填充XHR对象的属性,如下:responseText:作为响应主体被返回的文本
responseXML:
status:响应的HTTP状态
statusText:HTTP的状态说明
接收到响应后应该判断响应状态,再执行后续操作 xhr.open('get', 'localhot:3000/user') xhr.send(null) if ((xhr.status >= 200 && xhr.status < 300 || xhr.status == 304)) { alert(xhr.responseText) } else { alert('request was unsuccessful:' + xhr.status) }XHR对象的 readyState 属性
0:未初始化,即尚未调用open()方法。
1:启动,即已经调用open()方法,但尚未调用send()方法。
2:发送,即已经调用send()方法,但尚未接收到响应。
3:接收,即已经接收到部分响应数据。
4:完成,即已经接收到全部响应数据,而且已经可以在客户端使用。
可以用readystatechang事件监听readyState属性值的变化 var xhr = createXHR() xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if ((xhr.status >= 200 && xhr.status < 300 || xhr.status == 304)) { alert(xhr.responseText) } else { alert('request was unsuccessful:' + xhr.status) } } } xhr.open('get','localhot:3000/users',true) xhr.send(null) 在接收到响应之前还可以调用abort()方法来取消异步请求 xhr.abort() 调用此方法后,XHR对象会停止触发事件,也不再允许访问任何与响应有关的对象属性。Accept:
Accept-Charset:
Accept-Encoding:
Accept-Language:
Connection:
Cookie:
Host:
Referer:
User-Agent:
XHR也提供了操作这两种头部信息的方法;setRequestHeader()方法可以设置自定义的请求头信息;接收两个参数:头部字段的名称和头部字段的值的
var xhr = createXHR() xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if ((xhr.status >= 200 && xhr.status < 300 || xhr.status == 304)) { alert(xhr.responseText) } else { alert('request was unsuccessful:' + xhr.status) } } } xhr.open('get','user/user?name=zs',true) // 建议使用自定义的头部字段名称,不要使用浏览器注册发送的字段名称,否则可能影响服务器的响应 xhr.setRequestHeader('myHeader','Myvalue') xhr.send(null)getResponseHeader()方法可以获取响应头部信息;接受一个参数:头部字段名称
var myHeader = xhr.getResponseHeader('MyHeader')getAllResponseHeaders()方法会取得一个包含所有头部信息的长字符串
var allHeaders = xhr.getAllResponseHeades()