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 相关文章推荐
基于jQuery图片平滑连续滚动插件
Apr 27 Javascript
JavaScript 学习小结(适合新手参考)
Jul 30 Javascript
jQuery 表格工具集
Apr 25 Javascript
jquery中实现简单的tabs插件功能的代码
Mar 02 Javascript
JS保存、读取、换行、转Json报错处理方法
Jun 14 Javascript
js获取IP和PcName(IE)在vs中可用
Aug 02 Javascript
JavaScript中自定义事件用法分析
Dec 23 Javascript
javascript拖拽应用实例(二)
Mar 25 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
Jun 20 Javascript
jQuery表单对象属性过滤选择器实例详解
Sep 13 Javascript
jquery 实现复选框的全选操作实例代码
Jan 24 Javascript
8个非常实用的Vue自定义指令
Dec 15 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
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
PHP获取youku视频真实flv文件地址的方法
2014/12/23 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
PHP执行linux命令常用函数汇总
2016/02/02 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
javascript脚本编程解决考试分数统计问题
2008/10/18 Javascript
JavaScript中常用的运算符小结
2012/01/18 Javascript
javascript常见用法总结
2014/05/22 Javascript
JavaScript中的console.dir()函数介绍
2014/12/29 Javascript
jQuery中:image选择器用法实例
2015/01/03 Javascript
jQuery的文档处理程序详解
2016/05/10 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
jQuery 中ajax异步调用的四种方式
2016/06/28 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
在Vue中使用Compass的方法
2018/03/02 Javascript
vue中使用sessionStorage记住密码功能
2018/07/24 Javascript
JavaScript原型式继承实现方法
2019/11/06 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
使用Python脚本将绝对url替换为相对url的教程
2015/04/24 Python
在Django的模型中执行原始SQL查询的方法
2015/07/21 Python
Python3操作SQL Server数据库(实例讲解)
2017/10/21 Python
Python3 queue队列模块详细介绍
2018/01/05 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
TensorFlow实现Batch Normalization
2018/03/08 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
2018/03/31 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
python连接mongodb数据库操作数据示例
2020/11/30 Python
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
俄罗斯优惠券网站:BIGLION
2017/05/21 全球购物
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
小学教师节活动方案
2014/01/31 职场文书
音乐教育感言
2014/03/05 职场文书
春风化雨观后感
2015/06/11 职场文书
vue elementUI表格控制对应列
2022/04/13 Vue.js