JINXB'S BLOG


原生js封装一个ajax

将ajax封装

function myAjax(type,url,params,dataType,callback,async){
        var xhr = null;
        //1.创建异步对象
        if(window.XMLHttpRequest){
            xhr = new XMLHttpRequest();
        }else{
            xhr = new ActiveXObject("Microsoft.XMLHTTP");//兼容IE6以下的浏览器
        }
        if(type == "get"){
            //判断参数存在且不为空
            if(params && params != ""){
                url += "?" + params;
            }
        }
        //2.设置请求行open(请求方式,请求url,异步)
        xhr.open(type,url,async);
        if(type == "get"){
            xhr.send(null);
        }else if(type == "post"){
        //3.post方式 设置请求头,请求体
            xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            xhr.send(params);
        }
        //4.让异步对象接收服务器的响应数据
        if(async){
            xhr.onreadystatechange = function(){
                if(xhr.readyState == 4 && xhr.status ==200){
                    var result = null;
                    //判断服务器响应的数据类型
                    if(dataType == "json"){
                        result = JSON.parse(xhr.responseText);
                    }else if(dataType == "xml"){
                        result = xhr.responseXML;
                    }else{
                        result = xhr.responseText;
                    }
                    //回调函数
                    if(callback){
                        callback(result);
                    }
                }
            }
        }
   }

以上封装方式有两个缺点:
1.参数的顺序不可变
2.参数没有默认值,每次调用都需要传递

优化后

由于以上封装方法存在缺点,进一步优化,将封装的方式变为一个对象;

function myAjax(obj) {
        var defaults = {
            type: "get",
            url: "#",
            dataType: "json",
            data: {},
            async: true,
            success: function (result) {
                console.log(result);
            }
        }
        //obj中的属性,覆盖到defults中的属性
        //1.如果某些属性只存在于obj中,则会给defaults增加属性
        //2.如果某些属性obj和defaults中都存在,会将defaults中的默认值覆盖
        //3.如果某些属性只在defaults中存在,在obj中不存在,这时候将保留defaults中预定义的内容
        for (var key in obj) {
            defaults[key] = obj[key];
        }
        //第一步
        var xhr = null;
        if (window.XMLHttpRequest) {
            xhr = new XMLHttpRequest();
        } else {
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
        //得到params
        var params = "";
        for (var attr in defaults.data) {
            params += attr + "=" + defaults.data[attr] + "&";
        }
        if (params) {
            params = params.substring(0, params.length - 1);
        }
        if (defaults.type == "get") {
            defaults.url += "?" + params;
        }
        //第二步
        xhr.open(defaults.type, defaults.url, defaults.async);
        if (defaults.type == "get") {
            xhr.send(null);
        } else if (defaults.type == "post") {
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xhr.send(params);
        }
        //第三步
        if (defaults.async) {
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var result = null;
                    if (defaults.dataType == "json") {
                        result = JSON.parse(xhr.responseText);
                    } else if (defaults.dataType == "xml") {
                        result = xhr.responseXML;
                    } else {
                        result = xhr.responseText;
                    }
                    defaults.success(result);
                }
            }
        } else {
            if (xhr.readyState == 4 && xhr.status == 200) {
                var result = null;
                if (defaults.dataType == "json") {
                    result = JSON.parse(xhr.responseText);
                } else if (defaults.dataType == "xml") {
                    result = xhr.responseXML;
                } else {
                    result = xhr.responseText;
                }
                defaults.success(result);
            }
        }
    }

 评论


博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

Copyright 2019-2020 JINXB'S BLOG 鄂ICP备20002230号-1