Skip to content

XMLHttpRequest ​

简述 ​

XMLHttpRequest 对象不用刷新浏览器就可以直接和服务器交互,获取数据,加载内容等操作。相当于局部刷新内容,ajax就是基于此对象开发的。

实践 ​

new XMLHttpRequest() 返回一个对象,里面有各种属性和方法,还有事件监听器。在IE5, IE6下有兼容性,可以new ActiveXObject("Microsoft.XMLHTTP") 替换。

  • 实例化对象,有兼容性就处理。
  • 初始化请求open(method, url, [async=true]) ,第三个参数默认为true异步请求。
  • 发送数据send() 如果method为get,header时可以为空,要设置请求头时在这之前设置。
  • 监听onreadystatechange事件,当readyState变化时会触发该事件,可以在回调里判断请求是否成功readyState == 4 或 xhr.status == 200 都表示请求成功。
  • 最后就是处理请求返回的数据了xhr.responseText。
javascript
function ajax() {
    var xhr = null;
    if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest();
    } else if(window.ActiveXObject) {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xhr.open(method, url, async = true);
    xhr.setRequestHeader('auth', 'token');
    xhr.send();
    xhr.onreadystatechange = function() {
        if(xhr.readyState === 4 || xhr.status === 200) {
            console.log(xhr.responseText);
        }
    }
}

属性或方法 ​

readyState ​

readyState 代表一个请求码,不同时期有不同值,当这个值变时会触发onreadystatechange 监听的回调函数。一共有5 值,如下:

状态值描述
0UNSENT代理(实例化)被创建,但尚未调用open()方法。
1OPENEDopen()方法已被调用。
2HEADERS_RECEIVEDsend()方法已被调用,并且头部和状态已经可以获得。
3LOADING下载中;responseText属性已经包含部分数据。也就是说onprogress 事件在触发的过程中。
4DONE下载操作完成,可以这个为准处理成功的数据

onreadystatechange ​

当readyState 属性改变时,触发该监听的回调事件

responseType ​

手动设置服务器响应数据的类型,默认为 text 。当设置为空字符串时也是默认text。

注意:

  • 设值时和设header一样,在open()和send() 之间才可以。
  • 设置的类型和服务器响应的数据类型不兼容时,返回的数据变成null。比如说:响应数据是text/html时,设置为json 时获取到的就是null
值描述
“ ” 或 text默认类型(DOMString)
arraybufferresponse是一个二进制数据 ArrayBuffer
blobresponse 是一个二进制数据 Blob
documentresponse是一个HTML Document或XML XMLDocument,取决于接收到的数据的MIME类型
jsonresponse是一个JavaScript对象。这个对象是通过JSON解析得到的

response ​

服务器响应的数据类型,类型可以是ArrayBuffer、Blob、Document、JavaScript Object、DOMString默认值,取决于responseType 属性。

responseText ​

只能在responseType 属性为text时获取服务器响应的值,responseType是其他值时会报错。

请求未发出或未成功时为null。

responseURL ​

返回响应的序列化(serialized)URL,如果该 URL 为空,则返回空字符串。

status ​

HTTP状态码

statusText ​

和status 状态码对应的状态本文

timeout ​

设置请求最大的超时时间(毫秒),若超出该时间时,请求会自动结束。

ontimeout ​

当请求超时会触发监听事件。

upload ​

代表上传代表的对象。可以绑定事件追踪上传进度。事件和XMLHttpRequest一样

withCredentials ​

布尔值,默认为false 。当跨域请求时,cookies,authorization headers头部受权或TLS客户端证书,服务器无法获取上述内容,因为浏览器忽略这些不会和请求一起发送到后端的,只有设置为true 时才会发送给服务器。

方法 ​

  • abort如果请求已发送,立即中止请求。
  • getAllResponseHeaders 以字符串形式返回所有用CRLF分隔的响应头,没响应是null。
  • getResponseHeader(headerName) 返回指定响应头的字符串,未响应或不存在则是null 。
  • open(method, url, [async=true]) 初始化一个请求。
  • setRequestHeader(headerName, headerValue) 在open之后send之前才有效
  • send(data) 发送请求数据。
  • overrideMimeType 重写由服务器返回的mime类型

事件 ​

请求过程中会有一系列事件监听。

可以用on + type,也可以用addEventListener监听事件。

事件描述
abort当request请求停止时触发,如调用abort方法会触发
error当request遭遇错误时触发
load当request请求成功时触发
loadend请求结束时触发,无论成功(load)还是失败(error)触发
loadstart请求收到响应数据时触发(数据还没完全响应,和progress 同一时期触发)
progress请求接收到数据开始周期触发
timeout在预设时间内没收到响应时触发