(1)特点
(2)原理
XMLHttpRequest
对象。(1)创建XMLHttpRequest
对象
var xhr = new XMLHttpRequest();
(2)向服务器发送请求
xhr.open(method,url,async);
send(string);//post请求时才使用字符串参数,否则不用带参数。
method
:请求的类型;GET 或 POSTurl
:文件在服务器上的位置async:true
(异步)或 false
(同步)注意:post请求一定要设置请求头的格式内容
代码实例
xhr.open("POST","test.html",true);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send("fname=Henry&lname=Ford"); //post请求参数放在send里面,即请求体
(3)处理服务端响应
同步处理
xhr.open("GET","info.txt",false);
xhr.send();
document.getElementById("myDiv").innerHTML=xhr.responseText; //获取数据直接显示在页面上
异步处理
xhr.onreadystatechange=function() {
if (xhr.readyState===4 &&xhr.status===200) {
document.getElementById("myDiv").innerHTML=xhr.responseText;
}
}
xhr.readyState === 4
的时候,说明请求结束;xhr.status === 200
,说明请求成功,已经获取到服务端数据,将数据渲染到页面上。(4)readyState(XHR状态)
(5)status(HTTP状态码)
XMLHttpRequest
对象readyState
属性值为4,status
属性值为200,就将回调函数放到任务队列中排队执行。function ajax(url, fnSucc, fnFaild) {
var xhttp;
// 第一步:创建XMLHttpRequest对象
if (window.XMLHttpRequest) {
// 现代浏览器
xhttp = new XMLHttpRequest();
} else {
// IE6等老版本浏览器
xhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
// 第二步:初始化XMLHttpRequest方法
xhttp.open('GET', url);
// 第三步:XMLHttpRequest向服务器发送请求
xhttp.send();
// 第四步:处理响应
xhttp.onreadystatechange = function() {
if (xhttp.readyState === 4) {
if (xhttp.status === 200) {
fnSucc(xhttp.responseText)
} else {
if (fnFaild) fnFaild(xhttp.responseText)
}
}
}
}
Level 1的缺点
Level 2 改进
设置 request header
获取 response header
xhr
提供了2个用来获取响应头部的方法:getAllResponseHeaders
和getResponseHeader
。指定xhr.respons类型
有些时候我们希望xhr.response 返回的就是我们想要的数据类型。比如:响应返回的数据是纯JSON字符串,但我们期望最终通过xhr.response 拿到的直接就是一个 js 对象,我们该怎么实现呢?
responseType 是xhr level 2 新增的属性,用来指定xhr.response 的数据类型
获取 response 数据
追踪ajax请求的当前状态
设置请求的超时时间
获取上传、下载的进度
onprogress
事件来实时显示进度,默认情况下这个事件每50ms触发一次。onprogress
事件。
xhr.upload
对象的 onprogress
事件xhr
对象的onprogress
事件跨域携带cookie
xhr.withCredentials=true
onreadystatechange
xhr.readyState
改变时触发onloadstart
xhr.send()
方法后立即触发onprogress
xhr.upload.onprogress
在上传阶段(即xhr.send()之后,xhr.readystate=2
之前)触发,每50ms触发一次;xhr.onprogress
在下载阶段(即xhr.readystate=3
时)触发,每50ms触发一次。onload
xhr.readystate = 4
onloadend
onabort
xhr.abort()
后触发ontimeout:设置超时
xhr.timeout
不等于0,由请求开始即onloadstart
开始算起,当到达xhr.timeout
所设置时间请求还未结束即onloadend
,则触发此事件。onerror:网络层级别的异常
发生abort/timeout/error异常的处理
abort
或timeout
或error
异常,先立即中止当前请求readystate
置为4
,并触发 xhr.onreadystatechange
事件xhr.upload.onprogress
xhr.upload.[onabort或ontimeout或onerror]
xhr.upload.onloadend
xhr.onprogress
事件xhr.[onabort或ontimeout或onerror]
事件xhr.onloadend
事件在哪个xhr事件中注册请求成功回调?
xhr.onreadystatechange
和xhr.onload
两个事件。xhr.onreadystatechange
是每次xhr.readyState
变化时都会触发,而不是xhr.readyState=4
时才触发。所以选择 xhr.onload
事件xhr.onload = function () {
//如果请求成功
if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
//do successCallback
}
}