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 相关文章推荐
SuperSlide标签切换、焦点图多种组合插件
Mar 14 Javascript
JavaScript实现添加、查找、删除元素
Jul 02 Javascript
js代码实现随机颜色的小方块
Jul 30 Javascript
AngularJs 60分钟入门基础教程
Apr 03 Javascript
jQuery操作cookie
Aug 08 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
Aug 11 Javascript
使用Vue开发一个实时性时间转换指令
Jan 17 Javascript
JS实现图片旋转动画效果封装与使用示例
Jul 09 Javascript
详解如何构建Promise队列实现异步函数顺序执行
Oct 23 Javascript
JS中如何轻松遍历对象属性的方式总结
Aug 06 Javascript
Vue实现仿iPhone悬浮球的示例代码
Mar 13 Javascript
基于JS实现操作成功之后自动跳转页面
Sep 25 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
Yii框架关联查询with用法分析
2014/12/02 PHP
PHP实现动态创建XML文档的方法
2018/03/30 PHP
php tpl模板引擎定义与使用示例
2019/08/09 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
PHP的imageTtfText()函数深入详解
2021/03/03 PHP
二级域名转向类
2006/11/09 Javascript
javascript+xml技术实现分页浏览
2008/07/27 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
使用闭包对setTimeout进行简单封装避免出错
2013/07/10 Javascript
js中widow.open()方法使用详解
2013/07/30 Javascript
js与jquery实时监听输入框值的oninput与onpropertychange方法
2015/02/05 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
Vue利用路由钩子token过期后跳转到登录页的实例
2017/10/26 Javascript
js实现rem自动匹配计算font-size的示例
2017/11/18 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
[56:57]LGD vs VP 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第一场 8.20.mp4
2019/08/22 DOTA
使用python解析xml成对应的html示例分享
2014/04/02 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
浅析python打包工具distutils、setuptools
2018/04/20 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
解决python opencv无法显示图片的问题
2018/10/28 Python
Tensorflow实现神经网络拟合线性回归
2019/07/19 Python
PyQt5的相对布局管理的实现
2020/08/07 Python
详解Pycharm与anaconda安装配置指南
2020/08/25 Python
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
一年级家长会邀请函
2014/01/25 职场文书
硕士生工作推荐信
2014/03/07 职场文书
欢迎词怎么写
2015/01/23 职场文书
幼儿园见习总结
2015/06/23 职场文书
优秀教师工作总结2015
2015/07/22 职场文书
十个Python自动化常用操作,即拿即用
2021/05/10 Python
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python