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 While 循环基础教程
Apr 05 Javascript
Jquery AJAX 用于计算点击率(统计)
Jun 30 Javascript
深入分析JSONP跨域的原理
Dec 10 Javascript
js行号显示的文本框实现效果(兼容多种浏览器 )
Oct 23 Javascript
微信小程序 开发之快递查询功能的实现
Jan 09 Javascript
fullCalendar中文API官方文档
Feb 07 Javascript
socket.io实现在线群聊功能
Apr 07 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
Sep 18 Javascript
Vue表单demo v-model双向绑定问题
Jun 29 Javascript
vue组件tabbar使用方法详解
Nov 06 Javascript
vue resource发送请求的几种方式
Sep 30 Javascript
详解element-ui动态限定的日期范围选择器代码片段
Jul 03 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模拟HTTP认证
2006/10/09 PHP
PHP 日志缩略名的创建函数代码
2010/05/26 PHP
ThinkPHP写第一个模块应用
2012/02/20 PHP
PHP基于单例模式实现的mysql类
2016/01/09 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
myEvent.js javascript跨浏览器事件框架
2011/10/24 Javascript
jQuery代码实现发展历程时间轴特效
2015/07/30 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
Vue添加请求拦截器及vue-resource 拦截器使用
2017/11/23 Javascript
微信小程序中悬浮窗功能的实现代码
2019/08/02 Javascript
layui--js控制switch的切换方法
2019/09/03 Javascript
JS实现放烟花效果
2020/03/10 Javascript
js代码实现轮播图
2020/05/04 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
pygame学习笔记(5):游戏精灵
2015/04/15 Python
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
Python实现爬虫爬取NBA数据功能示例
2018/05/28 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
Pandas —— resample()重采样和asfreq()频度转换方式
2020/02/26 Python
解决numpy矩阵相减出现的负值自动转正值的问题
2020/06/03 Python
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
大学生求职简历的自我评价
2013/10/14 职场文书
网络教育自我鉴定
2013/11/01 职场文书
儿子婚宴答谢词
2014/01/09 职场文书
老公爱的承诺书
2014/03/31 职场文书
单位工作证明格式模板
2014/10/04 职场文书
2014年电厂个人工作总结
2014/11/27 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
如何搭建 MySQL 高可用高性能集群
2021/06/21 MySQL
Python借助with语句实现代码段只执行有限次
2022/03/23 Python
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers