手写 AJAX

260 阅读2分钟

AJAX 是 Asynchronous JavaScript And XML 的简称,它允许我们在不刷新整个页面的情况下,就可以异步获取数据,并更新页面的部分内容。

步骤

1. 创建 XMLHttpRequest 对象

var request = new XMLHttpRequest()

2. 设置请求的方式和地址

创建异步对象后,通过 open() 方法设置ajax请求的方式和请求地址。格式:request.open('GET/Post', '/XXX' , true)
第一个参数:请求的类型;GET 还是 POST
第二个参数:请求的文件地址url
第三个参数:设置请求方法是不是异步asynctrue为异步,false为同步。但是AJAX存在的意义就是发起异步请求,所以第三个参数永远传true,默认不填即为true

3. 发送请求

通过异步对象的send()发送请求

request.send()

特别注意的是:如果发送POST请求,请使用setRequestHeader()来添加HTTP请求头,并在send方法中传递要发送的数据:

request.open("POST", "/xxx", true)
request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
request.send(data);

4. 通过onreadystatechange监听状态变化

onreadystatechange可以监听异步对象请求状态码 readyState 的改变,每当 readyState 改变时,就会触发 onreadystatechange 事件。
readyState 变为4时,表示当前状态是请求完毕的状态。下面是 XMLHttpRequest.readyState 的状态码:

状态描述
0UNSENT代理被创建,但尚未调用 open() 方法。
1OPENEDopen() 方法已经被调用。
2HEADERS_RECEIVEDsend() 方法已经被调用,并且头部和状态已经可获得。
3LOADING下载中;responseText 属性已经包含部分数据。
4DONE下载操作已完成。

同时当 http 的响应码status为200到300之间(包括200和300)或为304时,表示 ajax 请求成功。否则表示不成功。

实现代码

const ajax = (method, url, data, success, fail)=>{
    var request = new XMLHttpRequest()
    request.open(method, url)
    request.onreadystatechange = function(){
    if(request.readyState === 4){
        if(request.status >= 200 && request.status < 300 || request.status === 304){
            success(request)
        }else{
            fail(request)
        }
    }
}
request.send(JSON.stringify(data))
}