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 相关文章推荐
自动生成文章摘要的代码[JavaScript 版本]
Mar 20 Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
Oct 14 Javascript
jquery实现的Accordion折叠面板效果代码
Sep 02 Javascript
关于function类中定义变量this的简单说明
May 28 Javascript
jQuery使用getJSON方法获取json数据完整示例
Sep 13 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
Dec 13 Javascript
浅谈Vuejs Prop基本用法
Aug 17 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
Jan 20 Javascript
javascript自定义日期比较函数用法示例
Jul 22 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
Nov 09 Javascript
Nuxt的路由配置和参数传递方式
Nov 06 Javascript
mapboxgl实现带箭头轨迹线的代码
Jan 04 Javascript
预防网页挂马的方法总结
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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
用PHP编程语言开发动态WAP页面
2006/10/09 PHP
文件上传的实现
2006/10/09 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
php短址转换实现方法
2015/02/25 PHP
微信公众平台实现获取用户OpenID的方法
2015/04/15 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
PHP获取访问设备信息的方法示例
2019/02/20 PHP
jQuery原型属性和原型方法详解
2015/07/07 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
jQuery实现图片文字淡入淡出效果
2015/12/21 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
2016/09/04 Javascript
Vuejs第九篇之组件作用域及props数据传递实例详解
2016/09/05 Javascript
关于Promise 异步编程的实例讲解
2017/09/01 Javascript
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
微信小程序实现星级评价效果
2018/12/28 Javascript
微信小程序mpvue点击按钮获取button值的方法
2019/05/29 Javascript
JS轮播图的实现方法2
2020/08/25 Javascript
教你安装python Django(图文)
2013/11/04 Python
Python守护进程(daemon)代码实例
2015/03/06 Python
Python2.x中str与unicode相关问题的解决方法
2015/03/30 Python
在Python的while循环中使用else以及循环嵌套的用法
2015/10/14 Python
python 实现批量xls文件转csv文件的方法
2018/10/23 Python
python 从文件夹抽取图片另存的方法
2018/12/04 Python
python字符串格式化方式解析
2019/10/19 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
2020/11/19 Python
css3实现超炫风车特效
2014/11/12 HTML / CSS
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
《母亲的恩情》教学反思
2014/02/13 职场文书
2014年社区植树节活动方案
2014/02/28 职场文书
《青山不老》教学反思
2016/02/22 职场文书
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
2021/06/26 Python