1. 要实现的效果
// <!-- 1.导入自定义的ajax函数 -->
<script src="./js/itheima.js"></script>
<script>
// 调用自定义的 myAjax 函数,发起ajax函数请求
myAjax({
method: '请求类型',
url: '请求地址',
data: {
// '请求参数对象'
},
success: function (res) { // 成功的回调函数
console.log(res) // 打印数据
}
})
</script>
2. 定义options参数选项
myAjax() 函数是我们自定义的 Ajax 函数,它接收一个配置对象作为参数,配置对象中可以配置如下属性:
- method 请求的类型
- url 请求的 URL 地址
- data 请求携带的数据
- success 请求成功之后的回调函数
3 .处理data参数
需要把 data 对象,转化成查询字符串的格式,从而提交给服务器,因此提前定义 resolveData 函数如下:
/**
*
* @param {*} data 将对象转成查询字符串
* username=张三&age=20
*/
// 将对象转为查询字符串
function resolveData(data) {
var arr = [];
for (var key in data) {
var str = key + '=' + data[key]; //key=value
arr.push(str);
}
return arr.join('&'); //将数组转为字符串并以&分隔
}
4. 定义 myAjax 函数
在 myAjax() 函数中,需要创建 xhr 对象,并判断请求的类型,对请求类型进行 if … else … 的判断:
function myAjax(options) {
//1.创建xhr对象
let xhr = new XMLHttpRequest();
var params = resolveData(options.data);
//判断请求方式是GET 还是post
//toUpperCase() 方法用于把字符串转换为大写。
if (options.type.toUpperCase() == 'GET') {
//2.调用open options.url + '?' + params
xhr.open(options.type, params ? options.url + '?' + params : options.url);
xhr.send();
} else if (options.type.toUpperCase() == 'POST') {
xhr.open(options.type, options.url);
//3.设置请求头
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
//4.设置数据
xhr.send(params);
}
5 .监听注册事件
监听 onreadystatechange 事件:
// 注册监听
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
// 把服务器的json字符串转成js对象
var obj = JSON.parse(xhr.responseText);
options.success && options.success(obj);
}
};
}