JavaScript中模拟实现jsonp


Posted in Javascript onJune 19, 2015
function prescript(s) {
    if (s.cache === undefined) {
      s.cache = false;
    }
    if (s.crossDomain) {
      s.type = "GET";
    }
  }


  function prejsonp(s, originalSettings, jqXHR) {
    // 给回调函数命名
    var callbackName = s.jsonpCallback
    s.url += (/(?:)/.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName;
    // 脚本执行后使用数据转换器来检索json
    // 提供给代码获取服务器的是据
    s.getData = function() {
      if (!responseContainer) {
        jQuery.error(callbackName + " was not called");
      }
      return responseContainer[0];
    };
    //修改处理机制
    s.dataTypes[0] = "json";
    // 创建一个全局函数
    overwritten = window[callbackName];
    //用来收集服务器给的数据
    window[callbackName] = function() {
      responseContainer = arguments;
    };

    return "script";
  }

  /**
   * jsonp的预先处理
   */
  function inspectPrefiltersOrTransportsA(options, originalOptions, jqXHR) {
    //预处理jsonp
    var dataTypeOrTransport = prejsonp(options, originalOptions, jqXHR)
    //扩充dataTypes
    options.dataTypes.unshift(dataTypeOrTransport);
    //预处理script类型
    prescript(options)
  }


  /**
   * 分发器
   * @return {[type]} [description]
   */
  function inspectPrefiltersOrTransportsB(s, originalOptions, jqXHR) {
    return {
      send: function(_, complete) {
        var script = jQuery("<script>").prop({
          async: true,
          charset: s.scriptCharset,
          src: s.url
        }).on(
          "load error",
          callback = function(evt) {
            script.remove();
            callback = null;
            if (evt) {
              complete()
            }
          }
        );
        //<script async="" src="http://192.168.1.113:8080/github/jQuery/jsonp.php
        document.head.appendChild(script[0]);
      }
    }
  }

  /**
   * 模拟ajax的 jsonp请求
   * @param {[type]} options [description]
   * @return {[type]}     [description]
   */
  function createAjax(options) {

    if (typeof url === "object") {
      options = url;
      url = undefined;
    }

    options = options || {};

    /**
     * 参数
     * jQuery.ajaxSetup 是默认参数
     * @type {[type]}
     */
    var s = jQuery.ajaxSetup({}, options);

    // Deferreds
    // 异步机制
    var deferred = jQuery.Deferred();
    var completeDeferred = jQuery.Callbacks("once memory");

    /**
     * 实际返回的ajax对象
     * @type {Object}
     */
    var jqXHR = {}

    // 把jqXHR对象转化promise对象,?占尤?omplete、success、error方法
    deferred.promise(jqXHR).complete = completeDeferred.add;
    //别名
    jqXHR.success = jqXHR.done;
    jqXHR.error = jqXHR.fail;

    s.dataTypes = jQuery.trim(s.dataType || "*").toLowerCase().match(/(?:)/) || [""];

    //预处理
    inspectPrefiltersOrTransportsA(s, options, jqXHR);

    for (i in {
      success: 1,
      error: 1,
      complete: 1
    }) {
      jqXHR[i](s[i]);
    }

    /**
     * 分发器
     */
    transport = inspectPrefiltersOrTransportsB(s, options, jqXHR);

    function done(status, nativeStatusText, responses, headers) {
      console.log(s,s.getData())
    }

    //发送请求
    transport.send(s, done);

    return jqXHR;
  }


  function show(data){
    $('body').append('<li>'+ data +'</li>');
  }

  /**
   * 数据回调接收
   * @return {[type]} [description]
   */
  function flightHandler(){

  }

  $("#test").click(function(){
    //执行一个异步的HTTP(Ajax)的请求。
    var ajax = createAjax({
      url: 'http://192.168.1.113:8080/github/jQuery/jsonp.php',
      data: {
        'action': 'aaron'
      }, // 预传参的数组
      dataType: 'jsonp', // 数据类型
      jsonp: 'callback', // 指定回调函数名,与服务器端接收的一致,并回传回来
      jsonpCallback:flightHandler,
      success: function() {
        show('局部事件success')
      }
    })
  })
Javascript 相关文章推荐
javascript实现的网页局布刷新效果
Dec 01 Javascript
Jquery操作Select 简单方便 一个js插件搞定
Nov 12 Javascript
JS时间选择器 兼容IE6,7,8,9
Jun 26 Javascript
jquery Moblie入门—hello world的示例代码学习
Jan 08 Javascript
100个不能错过的实用JS自定义函数
Mar 05 Javascript
javascript面向对象之this关键词用法分析
Jan 13 Javascript
jQuery实现根据类型自动显示和隐藏表单
Mar 18 Javascript
在JavaScript中正确引用bind方法的应用
May 11 Javascript
JQuery操作textarea,input,select,checkbox方法
Sep 02 Javascript
PHP 实现一种多文件上传的方法
Sep 20 Javascript
react router 4.0以上的路由应用详解
Sep 21 Javascript
jQuery Validate插件ajax方式验证输入值的实例
Dec 21 jQuery
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
Jun 19 #Javascript
MVVM模式中ViewModel和View、Model有什么区别?
Jun 19 #Javascript
JavaScript中数据结构与算法(五):经典KMP算法
Jun 19 #Javascript
使用AngularJS编写较为优美的JavaScript代码指南
Jun 19 #Javascript
javascript格式化日期时间方法汇总
Jun 19 #Javascript
JavaScript中数据结构与算法(四):串(BF)
Jun 19 #Javascript
JavaScript中数据结构与算法(三):链表
Jun 19 #Javascript
You might like
深入PHP curl参数的详解
2013/06/17 PHP
php将session放入memcached的设置方法
2014/02/14 PHP
PHP实现的函数重载功能示例
2018/08/03 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
2019/03/18 PHP
jquery1.83 之前所有与异步列队相关的模块详细介绍
2012/11/13 Javascript
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
2015/08/10 Javascript
JavaScript基础知识之方法汇总结
2016/01/24 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
JS简单随机数生成方法
2016/09/05 Javascript
微信小程序 POST请求(网络请求)详解及实例代码
2016/11/16 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
python使用marshal模块序列化实例
2014/09/25 Python
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
python自动zip压缩目录的方法
2015/06/28 Python
Python简单获取自身外网IP的方法
2016/09/18 Python
Python处理XML格式数据的方法详解
2017/03/21 Python
pytorch 修改预训练model实例
2020/01/18 Python
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
建筑工程技术应届生自荐信
2013/09/27 职场文书
浙江文明网签名寄语
2014/01/18 职场文书
幼儿园安全检查制度
2014/01/30 职场文书
社区居务公开实施方案
2014/03/27 职场文书
缅怀先烈演讲稿
2014/09/03 职场文书
服装区域经理岗位职责
2015/04/10 职场文书
2015年设计师个人工作总结
2015/04/25 职场文书
会议主持词开场白
2015/05/28 职场文书
python 算法题——快乐数的多种解法
2021/05/27 Python
原生JS实现飞机大战小游戏
2021/06/09 Javascript
django中websocket的具体使用
2022/01/22 Python
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js