AJAX 的版本与特性
XMLHttpRequest Level 1
XMLHttpRequest Level 1 版本存在以下局限性:
- 无法发送跨域请求
- 不能传输非纯文本数据
- 无法获取传输进度
XMLHttpRequest Level 2
XMLHttpRequest Level 2 版本相比 Level 1 有了很大的改进,主要特性包括:
- 可以发送跨域请求
- 支持传输二进制数据(非文本数据)
- 支持上传文件
- 可以传输
FormData
对象 - 可以获取传输进度
- 可以设置请求超时时间
兼容性问题
虽然 XMLHttpRequest Level 2 带来了很多新特性,但并非所有浏览器都完全支持,主要兼容性问题包括:
- IE 8/9 和 Opera Mini 不支持 XMLHttpRequest Level 2 对象
- IE 10/11 不支持响应类型为 JSON
- 部分浏览器不支持请求超时设置
- 部分浏览器不支持
Blob
(文件二进制流)
HTTP 状态码与提示信息
通过xhr.status
可以获取服务器返回的 HTTP 状态码,xhr.statusText
可以获取服务器发送的状态提示信息。常见的状态码和提示信息如下:
- 200 OK 访问正常
- 301 Moved Permanently 永久重定向
- 302 Move Temporarily 临时重定向
- 304 Not Modified 未修改,也属于正常访问
- 307 Temporary Redirect 临时重定向
- 401 Unauthorized 未授权
- 403 Forbidden 禁止访问
- 404 Not Found 未找到指定资源
- 500 Internal Server Error 服务器内部错误
AJAX 的事件
AJAX 请求过程中会触发一系列事件,可以通过监听这些事件来执行相应的逻辑:
xhr.onloadstart
绑定 HTTP 请求发出时的监听函数xhr.onload
绑定请求成功完成时的监听函数xhr.onerror
绑定请求失败时的监听函数xhr.onabort
绑定请求被中止(调用abort()
方法)时的监听函数xhr.onloadend
绑定请求完成(不管成功还是失败)时的监听函数
这些事件的执行顺序如下:
loadstart
-> readyState===4
-> load
/error
/abort
-> loadend
请求超时处理
通过设置xhr.timeout
属性可以指定请求超时时间,单位为毫秒。如果在指定时间内没有收到响应,就会自动终止请求。将该属性设为 0 表示没有时间限制。
可以通过xhr.ontimeout
绑定一个超时监听函数,当请求超时时就会执行该函数。
下面是一个请求超时处理的示例
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
// 请求成功,清除定时器
clearTimeout(timer);
timer = null;
}
};
// 设置3秒超时
var timer = setTimeout(function () {
xhr.abort(); // 中止请求
clearTimeout(timer);
timer = null;
xhr = null;
}, 3000);
响应数据类型
通过设置xhr.responseType
属性,可以指定服务器返回数据的类型,例如"text"
、"json"
、"blob"
等。不同的类型可以通过不同的xhr.response*
属性来获取响应内容,具体可以参考XMLHttpRequest.responseType - Web API 接口参考 | MDN。
原生 AJAX 的使用场景
-
在移动端开发中,为了控制代码体积,通常会直接使用原生 AJAX 而不是引入第三方库。现代浏览器对 AJAX 的支持已经比较完善了。
-
大多数情况下 AJAX 请求都不会特别复杂,自己封装一个简单的 AJAX 工具函数就可以应对绝大部分场景了。
-
一些对性能要求比较高的场景,例如游戏开发,也会选择使用原生 AJAX 以获得更好的性能。