zoukankan      html  css  js  c++  java
  • js封装xhr【重复造轮子】

    仿jquery ajax,不过功能没那么多。贴代码

    --------------------------------------分割线------------------------------------------

    //MyXhr对象
    var MyXhr = function(config){
        this.config = config;
        var that = this;
        //默认配置项
        defaultConfig = {
            "options":{
                    "url"    : "",//请求地址
                    "method" : "post",//get||post
                    "async"  : true,//异步
                    "data"   : [],//post请求数据
                    "timeout": 5000//超时时间
                },
            "success":function(){
    
            },
            "error":function(){
                
            }
        };
        //合并配置项
        var mergeConfig = this.config = this.extend(this.config, defaultConfig);
        var xhr = this.createXhr();
        
        //处理逻辑
        var postData = null;
        var url = mergeConfig.options.url;
        if(mergeConfig.options.method == "post"){
            //post 用formate传值,省去加header
            postData = mergeConfig.options.data;
            var formData = new FormData();
            for(var item in postData){
                formData.append(item, postData[item]);
            }
            postData = formData;
        }else{
            //get方式用参数名和参数值用encodeURIComponent()编码
            url = this.dealUrl(url);
        }
        xhr.open(mergeConfig.options.method, url, mergeConfig.options.async);
        
        xhr.onreadystatechange = function(){
            //监听状态 0=>为初始化 1=>启动 2=>发送 3=>接受 4=>完成
            if(xhr.readyState == 4){
                if((xhr.status>=200 && xhr.status<300) || xhr.status==304){
                    that.config.success(xhr.responseText);
                }else{
                    that.config.error()+xhr.status;
                }
            }
        };
        xhr.send(postData);
    
        
    
        //超时报错
        xhr.ontimeout = function(){
            throw new Error("connect timeout");
        }
    }
    
    /**以下为公共方法**/
    //extend方法,与$.extend()相同
    MyXhr.prototype.extend = function (p1, p2){
            var p = (function loop(p1, p2){
                var p = {};//返回值
                for(var item in p2){
                    //如果是对象再次递归调用函数
                    if(typeof p2[item]==='object'){
                        p[item] = loop(p1[item], p2[item]);
                    }else{
                        /**自定义配置项覆盖默认配置**/
                        if((typeof p1)!='undefined' && (typeof p1[item])!='undefined' && p1[item]){
                            p[item] = p1[item];
                        }else{
                            p[item] = p2[item];                                        
                        }
                    }
                }
                return p;
            })(p1,p2);
            return p;s
    };
    
    //创建xhr
    /**支持XHR对象和ActiveX对象**/
    MyXhr.prototype.createXhr = function(){
        if(typeof XMLHttpRequest != "undefined"){
            return new XMLHttpRequest();
        }else if(typeof ActiveXObject != "undefined"){
            if(typeof arguments.callee.activeXString != "string"){
                var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp"];
                var i, len;
                for(i = o,len=versions.length; i<len; i++){
                    try{
                        new ActiveXObject(version[i]);
                        arguments.callee.activeXString = version[i];
                        break;
                    }catch(ex){
                        //跳过
                    }
                }
            }
            return new ActiveXObject(arguments.callee.activeXString);
        }else{
            throw new Error("NO XHR object available");
        }
    }
    
    //处理url
    MyXhr.prototype.dealUrl = function(url){
        var index = url.indexOf('?');
        if(index == -1){
            return url;
        }
        var domain = url.substring(0, index);
        var pars = url.slice(index+1);
        var arrs = pars.split('&');
        var newurl = domain;
        for(var item in arrs){
            var arr = arrs[item].split("=");
            var split = "&";
            if(item == 0){
                split = "?";
            }
            newurl += (split + encodeURIComponent(arr[0]) + "=" + encodeURIComponent(arr[1]));
        }
        return newurl;
    
    }

    使用方法:

    var xhr = new MyXhr({
                "options":{
                    "method":"post",
                    "url":"http://example.com/searchGoods"
                },
                "success":function(data){
                    console.log(data);
                },
                "error":function(){
                    console.log('error');
                }
            });
  • 相关阅读:
    spring boot自定义starter
    Java死锁以及命令检测
    Java线程状态切换以及核心方法
    PowerMock单元测试
    python数据结构与算法
    算法学习 并查集(笔试题目:找同伙)
    大写
    算法学习 交叉排序
    算法学习 长整数相加
    python数据结构与算法——哈希表
  • 原文地址:https://www.cnblogs.com/kkform/p/8240995.html
Copyright © 2011-2022 走看看