XMLHttpRequest
使用XMLHttpRequest实现一个Ajax(Asynchronous JavaScript And XML)
第一步:获取实例
let xhr;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}可以不考虑兼容写法。
第二步:初始化请求
xhr.open(method, url, async, user, password)async默认为true,Ajax存在的意义就是发异步请求,所以第三个参数可以默认不传。
第三步:发送参数
xhr.send(body)特别注意的是: 如果发送POST请求,请使用setRequestHeader()来添加 HTTP请求头,并在send()方法中传递要发送的数据:java
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send("fname=Henry&lname=Ford");第四步:处理返回结果
使用onreadystatechange事件监听状态变化
xmlhttp.onreadystatechange = function () {
// todo
}其中的关键逻辑点:
使用
xhr.readyState判断请求状态,状态值含义:0: 表示请求未初始化,还没有调用open()1: 服务器连接已建立,但是还没有调用send()2: 请求已接收,正在处理中(通常现在可以从响应中获取内容头)3: 请求处理中,通常响应中已有部分数据可用了,没有全部完成4:请求已完成;此阶段确认全部数据都已经解析完毕,可以通过异步对象的属性获取对应数据使用
xhr.state判断http状态使用
xhr.response作为请求结果返回
简约版
function myAjax(option = { method: "get", url: "", param: {}, onSuccess: (data) => {}, onError: (err) => {} }) {
const { method, url, param } = option;
const xhr = new XMLHttpRequest();
xhr.open(method, url);
xhr.send(param);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
onSuccess(xhr.response);
} else {
onError("请求失败!");
}
}
};
}参考:
Last updated