自己封装的一个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);
    }
});

http://img.mukewang.com/climg/5ebb67fc099e442514350478.jpg

http://img.mukewang.com/climg/5ebb686e09d5c93c12900312.jpg

老师您好,请看我自己封装的代码,经测试可以使用,我写这么长一大段代码,只是为了验证长期困扰我的一个问题,通过实践,自己使用代码实现了令我疑惑的问题。

疑惑:在课程我又一次看到了自己取名的参数(imgData)在函数体中直接使用,虽然我明白应该是又是jQuery的ajax里面自带的一个属性,然后我们传进去参数后,就可以直接使用这个参数进行操作,但是吧一直没实践过,不知道底层代码是怎么实现的,为此我根据自己的想法实现了下类似的功能,我在my_ajax中,我给它添加了一个this.data这个变量,然后就可以我穿不穿参数都可以拿到这个变量的值,传参了也可以直接使用这个参数来操作。

不知道event,还有之前讲的each()中的index和obj,还有本课程中的imgData都是用的这种或者类似这种方法来实现的吗,请老师解惑

写回答

1回答

好帮手慕久久

2020-05-13

同学你好,问题解答如下:

1. my_ajax的success方法中,直接能获取到data数据,是因为在my_ajax这个函数中使用了this定义了data。如下:

http://img.mukewang.com/climg/5ebbb745093810e605500077.jpg

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

http://img.mukewang.com/climg/5ebbb74e09807b5504370071.jpg

http://img.mukewang.com/climg/5ebbb7630961674105540068.jpg

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

http://img.mukewang.com/climg/5ebbb77c0985bcf510510285.jpg

所以能在my_ajax的success方法中直接拿到data数据。

2. jquery的success方法中的参数imgData,对应同学my_ajax函数中的da:

http://img.mukewang.com/climg/5ebbb7a2098ba05e05540214.jpg

http://img.mukewang.com/climg/5ebbb82c0957597805120295.jpg

它只是参数名,可以自定义。

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

http://img.mukewang.com/climg/5ebbb8de095776c316260287.jpghttp://img.mukewang.com/climg/5ebbb8e30962953013680423.jpghttp://img.mukewang.com/climg/5ebbb8ea09c9ae9608770471.jpg

3. 同学目前只需要知道原生ajax的封装过程,了解jquery的回调函数success中的参数是怎么拿到的就可以,不需要关注内部是如何实现的。更多的实现方式,以后可以通过看源代码来了解。

如果我的回答帮到了你,欢迎采纳,助学习愉快!

0

0 学习 · 14456 问题

查看课程