Ajax的封装


  哪些是公共不变的? 哪些是可以改变的或者将来需要改变的,把这些改变的作为参数。
 创建ajax   打开页面  发送数据  添加监听  这些是不变
 可以改变的:
 config = {
   type:"请求类型"  get||post,
   url:"请求地址",
   async:true,是否异步默认值true
   cache:false,是否缓存,默认不缓存
   data:{},数据默认json格式
   success:function(){},请求成功后的回调函数
   beforeSend:function(){},发送请求之前要执行的回调函数  可以放在open之前或者send之前
   complete:function(){} ,请求完成无论 成功或失败都要执行。 是readyState==4 请求完成。
 }
 需要将json数据转换成get参数格式
判断是否是post请求


//将变量闭包在匿名函数里面
(function () {

    //将json数据转换为get
    function jsonToget(data) {
        var str = "";
        //1.遍历(循环) json数据
        for (var i in data) {
            //2.将属性名与值连接起来  属性名=属性值&
            str += i + "=" + data[i] + "&";
        }
        //3.去除最后一个多余的&符号
        str = str.replace(/&+$/, "");

        return str;
    }


    //将自己写的调用与默认的合并
    function merge(ini){

        //配置默认选项
        var config={
            type: "get",
            url: "",
            async: true,
            cache: false,
            data: {},
            success: function() {},
            beforeSend: function() {},
            complete: function() {}
        };

        //如果没有传递参数,则默认为空对象
        ini=ini||{};

        //创建一个变量不给值,这就是undefined 用于比较属性是否是undefined
        var z;

        //遍历默认选项,即使传进来的是选项中没有属性也不会被添加进来
        for(var i in config){

            //i就是配置属性名,从ini中找这个对应的数据,有就覆盖当前配置,没有就用之前默认的配置
            config[i] = ini[i]===z?config[i]:ini[i];
        }

        return config;
    }


    //封装ajax函数
    function ajax(config) {

        //使用merge将config初始化合并一下
        config = merge(config);

        //创建ajax对象
        var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsoft.XMLHTTP");

        //先去判断请求是否是post
        var isPost = /post/i.test(config.type);

        //无论是get还是post都要把json数据转化成get参数类型
        config.data = jsonToget(config.data);
        //如果是get方式要判断是否要缓存,如果不要缓存 就加时间戳。向地址上加时间的时候要判断之前是否有?号
        if (!isPost) {

            config.url += (config.url.indexOf('?') > -1 ? '&' : '?') + config.data + "&" + (config.cache ? '' : new Date().getTime() + '=1');

        }
        //打开地址
        xhr.open(config.type, config.url, config.async);

        //如果是post,添加请求头
        if (isPost) {
            xhr.setRequestHeader("content-type", 'application/x-www-form-urlencoded');
        }

        //执行发送之前的回调函数 要执行回调函数一定要先判断它是不是函数!!!!
        if (typeof config.beforeSend == "function") {
            config.beforeSend();
        }

        //发送数据
        xhr.send(config.data);

        //添加监听事件
        xhr.onreadystatechange = function () {

            //判断请求是否完成
            if (xhr.readyState == 4) {

                //若请求完成,并有回调函数执行,不管请求是否成功
                if (typeof config.complete == "function") {

                    //为了方便以后的调试把访问状态码也传给回调函数,最好把xhr对象也传给它。
                    config.complete(xhr.status, xhr);
                }

                //如果请求成功就执行success函数
                if (typeof config.success == "function") {

                    config.success(xhr.responseText, xhr);
                }
            }
        }
    }
    //将ajax变为全局变量
        window.ajax = ajax;

})();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值