我的日常

登录/注册
您现在的位置:论坛 资料库 前端开发 > javascript如何跨域请求 包装函数
总共48086条微博

动态微博

查看: 2027|回复: 1

javascript如何跨域请求 包装函数

[复制链接]

326

主题

72

听众

999

金钱

实习版主

该用户从未签到

优秀版主

跳转到指定楼层
楼主
发表于 2015-02-05 09:49:17 |只看该作者 |倒序浏览
一、源码 // 定义AJAX跨域请求的JSON
(function(){
    if(typeof window.$JSON== 'undefined'){
        window.$JSON= {};
    };

    $JSON._ajax = function(config){
        config = config[0] || {};
        this.url = config.url || '';
        this.type = config.type || 'xhr';
        this.method = (this.type == 'json') ? 'GET' : config.method.toUpperCase() || 'GET';
        this.param = config.param || null;
        this.callback = config.callback || {};
        this.XHR = null;

        if(typeof window._$JSON_callback == 'undefined'){
            window._$JSON_callback = {};
        }

        this._createRequest();
    };

    $JSON._ajax.prototype = {

        // 缓存XHR请求,再次再调用时不再进行判断
        _createXHR : function(){
            var methods = [
                function(){ return new XMLHttpRequest(); },
                function(){ return new ActiveXObject('Msxml2.XMLHTTP'); },
                function(){ return new ActiveXObject('Microsoft.XMLHTTP'); }
            ];
            for(var i = 0, l = methods.length; i < l; i++){
                try{
                    methods[i]();
                }catch(e){
                    continue;
                }
                this._createXHR = methods[i];
                return methods[i]();
            }
        },

        // 建立XHR请求
        _createRequest : function(){
            return (this.type == 'json') ? this._setJSONRequest() : this._setXHRRequest();
        },

        _setXHRRequest : function(){
            var _this = this;
            var param = '';

            for(var i in this.param){
                if(param == ''){
                    param = i+'='+this.param[i];
                }else{
                    param+= '&'+i+'='+this.param[i];
                }
            }

            this.XHR = this._createXHR();
            this.XHR.onreadystatechange = function(){
                if(_this.XHR.readyState == 4 && _this.XHR.status == 200){
                    _this.callback.success(_this.XHR.responseText);
                }else{
                    _this.callback.failure('重新操作');
                }
            };

            this.XHR.open(this.method, this.url, true);
            this.XHR.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8");
            this.XHR.send(param);
        },

        // 建立JSON请求
        _setJSONRequest : function(){
            var head = document.getElementsByTagName('head')[0];
            var script = document.createElement('script');
            var fun = this._setRandomFun();
            var _this = this;
            var param = '';

            for(var i in this.param){
                if(param == ''){
                    param = i+'='+this.param[i];
                }else{
                    param+= '&'+i+'='+this.param[i];
                }
            }

            script.type = 'text/javascript';
            script.charset = 'utf-8';
            if(head){
                head.appendChild(script);
            }else{
                document.body.appendChild(script);
            }

            // data:为回调函数所需要传入的参数
            // 定义页面中的回调函数,如例子中的“jsonpCallback()”方法
            window._$JSON_callback[fun.id] = function(data){
                _this.callback.success(data);
                setTimeout(function(){
                    delete window._$JSON_callback[fun.id];
                    script.parentNode.removeChild(script);
                }, 100);
            };

            script.src = this.url+'?callback='+fun.name+'&'+param;
        },

        // 生成随机JSON回调函数
        _setRandomFun : function(){
            var id = '';
            do{
                id = '$JSON'+Math.floor(Math.random()*10000);
            }while(window._$JSON_callback[id])
            return{
                id : id,
                name : 'window._$JSON_callback.'+id
            }
        }
    };
    window.$JSON.ajax = function(){
        return new $JSON._ajax(arguments);
    }
})();

二、调用方式 //调用方式
var ajax = new $JSON.ajax({
    url : 'http://www.sina.com/api',
    type : 'json',
    method : 'get',
    param: {
        bar: true
    },
    callback : {
        success : function(data){
            console.log( '55668',data);
        },
        failure : function(error){
            alert(errow);
        }
    }
});



科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

1

主题

0

听众

117

金钱

三袋弟子

该用户从未签到

沙发
发表于 2016-11-18 16:48:15 |只看该作者
受教了!这个论坛果然很不错,适合学习
回复

使用道具 举报

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表