XMLHttpRequest level2

HTML5 更新了许多API,XMLHttpRequest 就是个中一个。level 2 的XMLHttpRequest 越发壮大了。

新建对象

var xhr = new XMLHttpRequst()
和之前一样

属性

先看老几样属性
onreadystatechange 同步ajax不可用此事宜回调,abort() 也不会触发此事宜,open() 之前设置
readyState 只读
responseText 只读
responseXML
responseURL
status
statusText

新属性
responseType 设置相应范例,可所以 arraybuffer / blob / document / json / text ,默许是 text
response 相应内容
timeout 超时毫秒数,同步要求不可用。默许是0,永不超时。在 open() 和 send() 之间设置,超时会触发 xhr 的 timeout 事宜
upload 只读,ajax 上传对象,背面细致讲
withCredentials Boolean,是不是许可跨域相应设置cookie,默许是 false

要领

abort() 触发 abort 事宜

getAllResponseHeaders() 返回一切相应头部构成的字符串

getResponseHeader(key)

open(method, url)

overrideMimeType(mimetype) 重写相应范例,假如须要的话,在 send() 之前挪用

send() 可以发送 FormData / Blob / Buffer / String / Document,不发送数据的话,发起运用 xhr.send(null)

setRequestHeader(key, value) 设置要求头,在 open() 和 send() 之间挪用。假如没有设置 Accept, 则默许是 */*

事宜

loadstart send() 以后触发,只触发一次
progress 进度事宜,会不停被触发

xhr.addEventListener('progress', ev => {
  if (ev.lengthComputable) {
    console.log(ev.loaded / ev.total);
  }
});

ev.lengthComputable 长度可计算
ev.loaded 吸收的字节数
ev.total 总字节数

// 可以运用 'onprogress' in xhr 推断浏览器是不是支撑 progress 事宜

load 相应完成时触发。运用此事宜就没必要再经由历程搜检 xhr.readyState === 4 来确认相应完成了。不过 load 事宜只是示意吸收到服务器的相应,还须要经由历程 xhr.status 来推断相应是不是胜利。
error
abort xhr.abort() 触发
timeout 设置 xhr.timeout 以后,相应超常常触发

upload

xhr.upload 是 ajax 上传对象
xhr.upload 也有以下事宜
progress
load
error
abort
xhr.upload.onprogress 和 xhr.onprogress 运用差不多,只是一个针对文件上传历程,一个针对从服务器猎取相应的历程

FormData

表单数据范例

var form = new FormData();
form.append('username', 'xiaoming');

或许
var form = new FormData(document.getElementsByTagName('form')[0]);

// 运用 FormData,不必设置要求的 Content-Type,xhr 可以自动识别并设置
// 假如不运用 FormData,发送表单须要先设置 Content-Type 为 `application/x-www-form-urlencoded`, 假如表单中有文件须要上传,则 Content-Type 为 `multipart/form-data`
xhr.send(form);

// 假如只是上传文件,可以直接运用 `xhr.send(file)`

综上所述,运用 ajax 时,步骤以下:

  • var xhr = new XMLHttpRequest();

  • xhr.onreadystatechange = function () {}; level2 险些可以不必了

  • xhr.open();

  • xhr 的相干设置,比方 事宜监听,要求头设置,相应头改写等

  • xhr.send();

    原文作者:syaka
    原文地址: https://segmentfault.com/a/1190000007493389
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞