javascript跨域请求包装函数与用法示例


Posted in Javascript onNovember 03, 2016

本文实例讲述了javascript跨域请求包装函数与用法。分享给大家供大家参考,具体如下:

一、源码

// 定义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);
    }
  }
});

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
浅析Js中的单引号与双引号问题
Nov 06 Javascript
Javascript节点关系实例分析
May 15 Javascript
jquery实现点击变换导航样式的方法
Aug 31 Javascript
一个php+js实时显示时间问题
Oct 12 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
Jan 18 Javascript
百度多文件异步上传控件webuploader基本用法解析
Nov 07 Javascript
AngularJS双向绑定和依赖反转实例详解
Apr 15 Javascript
30分钟快速实现小程序语音识别功能
Nov 27 Javascript
小程序使用watch监听数据变化的方法详解
Sep 20 Javascript
js实现网页随机验证码
Oct 19 Javascript
vue+vant 上传图片需要注意的地方
Jan 03 Vue.js
vue+django实现下载文件的示例
Mar 24 Vue.js
预防网页挂马的方法总结
Nov 03 #Javascript
网页挂马方式整理及详细介绍
Nov 03 #Javascript
AngularJS实现在ng-Options加上index的解决方法
Nov 03 #Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
Nov 03 #Javascript
基于vuejs+webpack的日期选择插件
May 21 #Javascript
Vue.js创建Calendar日历效果
Nov 03 #Javascript
AngularJS中transclude用法详解
Nov 03 #Javascript
You might like
PHP函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
php实现的简单多进程服务器类完整示例
2020/02/01 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2007/02/15 Javascript
javascript css float属性的特殊写法
2008/11/13 Javascript
js apply/call/caller/callee/bind使用方法与区别分析
2009/10/28 Javascript
Jquery+WebService 校验账号是否已被注册的代码
2010/07/12 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
JavaScript打开word文档的实现代码(c#)
2012/04/16 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
jquery使用jxl插件导出excel示例
2014/04/14 Javascript
JS实现仿苹果底部任务栏菜单效果代码
2015/08/28 Javascript
javascript ES6中箭头函数注意细节小结
2017/02/17 Javascript
shiro授权的实现原理
2017/09/21 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
2018/02/05 Javascript
javascript实现前端成语点击验证
2020/06/24 Javascript
python返回昨天日期的方法
2015/05/13 Python
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
python如何支持并发方法详解
2020/07/25 Python
python飞机大战游戏实例讲解
2020/12/04 Python
用CSS禁用输入法(CSS3 UI规范)实例解析
2012/12/04 HTML / CSS
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/04/11 面试题
EJB实例的生命周期
2016/10/28 面试题
超市后勤自我鉴定
2014/01/17 职场文书
校园环保建议书
2014/05/14 职场文书
法人代表任命书范本
2014/06/05 职场文书
法院授权委托书范文
2014/08/02 职场文书
学校运动会广播稿100条
2014/09/14 职场文书
班主任师德师风自我剖析材料
2014/10/02 职场文书
商务代表岗位职责
2015/02/15 职场文书
社区挂职锻炼个人工作总结
2015/10/23 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
Javascript的promise,async和await的区别详解
2022/03/24 Javascript