原生 AJAX
Posted: 10.08.2019
介绍
震惊!9102 年了竟然还有人手写 AJAX!
axios 不知道,好歹也知道 jQuery,不然就别搞前端了,养猪去吧。
但是有的面试官就是会叫你手写 AJAX,然后问一些很变态的问题。
如下:XMLHttpRequest 的 readyState 有哪几种状态?
不要觉得这是啥叼问题。年轻人,基础还是要牢牢掌握的啊。
状态
| Value | 状态 | 描述 |
|---|---|---|
| 0 | UNSENT | 代理被创建,但尚未调用 open() 方法 |
| 1 | OPENED | open() 方法已经被调用 |
| 2 | HEADERS_RECEIVED | send() 方法已经被调用,并且头部和状态已经可获得 |
| 3 | LOADING | 下载中; responseText 属性已经包含部分数据。 |
| 4 | DONE | 下载操作已完成 |
在接下来的代码里,你会发现我们检查 readyState 是否为4,就是这个原因
GET 方法
var xhr = new XMLHttpRequest();
// 第三个参数为是否异步,true 代表异步
xhr.open('get', 'MyServlet', true);
xhr.send();
xhr.onreadystatechange = function () {
/**
* readyState 和 status 是不相关的
* readyState 代表了 AJAX 是否完成
* status 代表了状态码,就算 AJAX 已完成也可以是 404 之类的
*
* 每次 readyState 改变的时候,都会触发回调函数
*/
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText);
}
}
POST 方法
var data = { test: 'OK' };
var xhr = new XMLHttpRequest();
xhr.open('post', 'MyServlet', true);
/**
* post 请求一定要添加请求头才行,不然会报错
* 而且一定要在 open 后设置才行,不然会报错
*/
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
/**
* 发送的时候,需要将数据转化成字符串的形式
* 因为这里是 form-urlencoded,不是必须为字符串
* 具体根据你的 Content-Type 来判断
*/
xhr.send(JSON.stringify(data));
// 每次 readyState 改变的时候,都会触发回调函数
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText);
}
}