这里主要分析XMLHttpRequest
对象,下面是它的一段基础使用:
var xhr = new XMLHttpRequest();
xhr.open('post','www.xxx.com',true)
// 接收返回值
xhr.onreadystatechange = function(){
if(xhr.readyState === 4 ){
if(xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
console.log(xhr.responseText);
}
}
}
// 处理请求参数
postData = {"name1":"value1","name2":"value2"};
postData = (function(value){
var dataString = "";
for(var key in value){
dataString += key+"="+value[key]+"&";
};
return dataString;
}(postData));
// 设置请求头
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
// 异常处理
xhr.onerror = function() {
console.log('Network request failed')
}
// 跨域携带cookie
xhr.withCredentials = true;
// 发出请求
xhr.send(postData);
复制代码
下面分别对XMLHttpRequest
对象常用的的函数、属性、事件进行分析。
函数
open
用于初始化一个请求,用法:
xhr.open(method, url, async);
复制代码
method
:请求方式,如get、post
url
:请求的url
async
:是否为异步请求
send
用于发送HTTP
请求,即调用该方法后HTTP
请求才会被真正发出,用法:
xhr.send(param)
复制代码
param
:http请求的参数,可以为string、Blob
等类型。
abort
用于终止一个ajax
请求,调用此方法后readyState
将被设置为0
,用法:
xhr.abort()
复制代码
setRequestHeader
用于设置HTTP
请求头,此方法必须在open()
方法和send()
之间调用,用法:
xhr.setRequestHeader(header, value);
复制代码
getResponseHeader
用于获取http
返回头,如果在返回头中有多个一样的名称,那么返回的值就会是用逗号和空格将值分隔的字符串,用法:
var header = xhr.getResponseHeader(name);
复制代码
属性
readyState
用来标识当前XMLHttpRequest
对象所处的状态,XMLHttpRequest
对象总是位于下列状态中的一个:
值 | 状态 | 描述 |
---|---|---|
0 | UNSENT | 代理被创建,但尚未调用 open() 方法。 |
1 | OPENED | open() 方法已经被调用。 |
2 | HEADERS_RECEIVED | send() 方法已经被调用,并且头部和状态已经可获得。 |
3 | LOADING | 下载中; responseText 属性已经包含部分数据。 |
4 | DONE | 下载操作已完成。 |
status
表示http
请求的状态, 初始值为0
。如果服务器没有显式地指定状态码, 那么status
将被设置为默认值, 即200
。
responseType
表示响应的数据类型,并允许我们手动设置,如果为空,默认为text
类型,可以有下面的取值:
值 | 描述 |
---|---|
"" | 将 responseType 设为空字符串与设置为"text" 相同, 是默认类型 (实际上是 DOMString )。 |
"arraybuffer" | response 是一个包含二进制数据的JavaScript ArrayBuffer 。 |
"blob" | response 是一个包含二进制数据的 Blob 对象 。 |
"document" | response 是一个HTML Document 或XML XMLDocument ,这取决于接收到的数据的 MIME 类型。 |
"json" | response 是一个 JavaScript 对象。这个对象是通过将接收到的数据类型视为JSON 解析得到的。 |
"text" | response 是包含在DOMString 对象中的文本。 |
response
返回响应的正文,返回的类型由上面的responseType
决定。
withCredentials
ajax
请求默认会携带同源请求的cookie
,而跨域请求则不会携带cookie
,设置xhr
的withCredentials
的属性为true
将允许携带跨域cookie
。
事件回调
onreadystatechange
xhr.onreadystatechange = callback;
复制代码
当readyState
属性发生变化时,callback会被触发。
onloadstart
xhr.onloadstart = callback;
复制代码
在ajax
请求发送之前(readyState==1
后, readyState==2
前),callback
会被触发。
onprogress
xhr.onprogress = function(event){
console.log(event.loaded / event.total);
}
复制代码
回调函数可以获取资源总大小total
,已经加载的资源大小loaded
,用这两个值可以计算加载进度。
onload
xhr.onload = callback;
复制代码
当一个资源及其依赖资源已完成加载时,将触发callback
,通常我们会在onload
事件中处理返回值。
异常处理
onerror
xhr.onerror = callback;
复制代码
当ajax
资源加载失败时会触发callback
。
ontimeout
xhr.ontimeout = callback;
复制代码
当进度由于预定时间到期而终止时,会触发callback
,超时时间可使用timeout
属性进行设置