自己封装的一个ajax
来源:2-11 jquery的ajax方法
WittChen
2020-05-13 11:36:11
var my_ajax = function (option) {
// ajax需要的变量及默认值
var type = option.type || "get";
var url = option.url;
var async = option.async || true;
var dataType = option.datatype || "json";
var successCallback = function (data) {
if (option.success) {
option.success(data);
}
};
var dataFunc = function (datatype, data) {
if (dataType === "json") {
return JSON.parse(data);
} else {
return null;
}
};
this.data = null;
// 创建XMLHttpRequest 对象
var createXHR = function () {
var xhr;
if (XMLHttpRequest !== "undefined") {
xhr = new XMLHttpRequest();
return xhr;
} else {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
};
var xhr = createXHR();
// 响应状态触发函数
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
data = dataFunc(dataType, xhr.responseText);
response = data;
{#console.log(eval("(" + xhr.responseText + ")"));#}
{#console.log(JSON.parse(xhr.responseText));#}
successCallback(data);
}
}
};
// 初始化链接(建立链接)
xhr.open(type, url, true);
// 发送请求
xhr.send(null);
};
// 调用封装的ajax
my_ajax({
url: "/media/json/test.json",
type: "get",
async: true,
dataType: "json",
success: function(da){
console.log(da);
console.log(data);
}
});

老师您好,请看我自己封装的代码,经测试可以使用,我写这么长一大段代码,只是为了验证长期困扰我的一个问题,通过实践,自己使用代码实现了令我疑惑的问题。
疑惑:在课程我又一次看到了自己取名的参数(imgData)在函数体中直接使用,虽然我明白应该是又是jQuery的ajax里面自带的一个属性,然后我们传进去参数后,就可以直接使用这个参数进行操作,但是吧一直没实践过,不知道底层代码是怎么实现的,为此我根据自己的想法实现了下类似的功能,我在my_ajax中,我给它添加了一个this.data这个变量,然后就可以我穿不穿参数都可以拿到这个变量的值,传参了也可以直接使用这个参数来操作。
不知道event,还有之前讲的each()中的index和obj,还有本课程中的imgData都是用的这种或者类似这种方法来实现的吗,请老师解惑
1回答
同学你好,问题解答如下:
1. my_ajax的success方法中,直接能获取到data数据,是因为在my_ajax这个函数中使用了this定义了data。如下:

而在该方法中,this指代的是window,如下:


所以相当于在全局作用域中定义了变量data; 然后在请求成功后,为data进行了赋值操作,如下:

所以能在my_ajax的success方法中直接拿到data数据。
2. jquery的success方法中的参数imgData,对应同学my_ajax函数中的da:


它只是参数名,可以自定义。
jquery的success方法中之所以能获取到数据imgData,是因为在xhr的onreadystatechange事件中,当请求成功后,调用了传入的success方法,并对其传参,和同学代码中的如下位置相似:



3. 同学目前只需要知道原生ajax的封装过程,了解jquery的回调函数success中的参数是怎么拿到的就可以,不需要关注内部是如何实现的。更多的实现方式,以后可以通过看源代码来了解。
如果我的回答帮到了你,欢迎采纳,助学习愉快!
相似问题
回答 1