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 异步调用框架 (Part 1 - 问题 &amp; 场景)
Aug 03 Javascript
jQuery 选择器、DOM操作、事件、动画
Nov 25 Javascript
js 左右悬浮对联广告代码示例
Dec 12 Javascript
JavaScript实现向setTimeout执行代码传递参数的方法
Apr 16 Javascript
javascript实现tab切换特效
Nov 12 Javascript
一道常被人轻视的web前端常见面试题(JS)
Feb 15 Javascript
React组件的三种写法总结
Jan 12 Javascript
javaScript实现复选框全选反选事件详解
Nov 20 Javascript
jQuery中复合选择器简单用法示例
Mar 31 jQuery
webpack4.0 入门实践教程
Oct 08 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
Apr 19 Javascript
IDEA安装vue插件图文详解
Sep 26 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
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
2013/06/29 PHP
基于PHP的简单采集数据入库程序
2014/07/30 PHP
smarty表格换行实例
2014/12/15 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
php生成PDF格式文件并且加密
2015/06/22 PHP
Django 中 cookie的使用
2017/08/17 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
一些mootools的学习资源
2010/02/07 Javascript
node.js中的url.format方法使用说明
2014/12/10 Javascript
Nodejs学习笔记之Stream模块
2015/01/13 NodeJs
JS获取一个未知DIV高度的方法
2016/08/09 Javascript
javascript 初学教程及五子棋小程序的简单实现
2017/07/04 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
javascript利用键盘控制小方块的移动
2020/04/20 Javascript
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
用python实现百度翻译的示例代码
2018/03/09 Python
Python中property函数用法实例分析
2018/06/04 Python
Python中new方法的详解
2019/01/15 Python
python爬虫 基于requests模块的get请求实现详解
2019/08/20 Python
python下载库的步骤方法
2019/10/12 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
最简单的matplotlib安装教程(小白)
2020/07/28 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
2013/01/09 HTML / CSS
html5定位获取当前位置并在百度地图上显示
2014/08/22 HTML / CSS
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
计算机操作自荐信
2013/12/07 职场文书
道德大讲堂实施方案
2014/05/14 职场文书
家长给学校的建议书
2014/05/15 职场文书
青年标兵事迹材料
2014/08/16 职场文书
大学四年个人总结
2015/03/03 职场文书
2015国庆节66周年演讲稿
2015/03/20 职场文书
旷工辞退通知书
2015/04/17 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
医院党建工作总结2015
2015/05/26 职场文书