需求场景:借助 ajaxTransport 来自定义扩展功能。

  1. 项目需求:jQuery 版本: 1.10.2,错误打点,发起 jsonp 请求发生错误的时候前端需要向打点地址发送一个请求。

  2. 简单演示:
    测试代码:

    $.ajax('http://google.com/a.js',{
           type: 'GET',dataType: 'jsonp',success: function(success,statusText,jqXHR){
               console.log('jsonp request success');
           },error: function(jqXHR,error){
               console.log('jsonp error');
           }
       });
       
       由于 1.10.2 版本的 jquery 并没有对创建的 script 监听错误事件,故无法调用 error 方法,故无法进一步将前端信息错误上报

    解决方案:

    $.ajaxTransport('+script',function(s){
           // This transport only deals with cross domain requests
           var script,head = document.head || $('head')[0] || document.documentElement;
                
           return {
               send: function(_,callback) {
                   
                   script = document.createElement('script');
                   
                   script.async = true;
                   
                   if(s.scriptCharset){
                       script.charset = s.scriptCharset;
                   }
                   
                   script.src = s.url;
                   
                   // Handle error
                   script.onerror = function(err){
                       // Handle memory lead in IE
                       script.onload = script.onreadystatechange = null;
                       script.onerror = null;
                       
                       // Remove the script
                       if(script.parentNode){
                           script.parentnode.removeChild(script);
                       }
                       
                       // Dereference the script
                       script = null;
                       
                       if(err.type === 'error'){
                           callback(404,err.type);
                       }
                   }
                   
                   // Attach handlers for all browsers
                   script.onload = script.onreadystatechange = function(_,isAbort){
                       
                       if(isAbort || !script.readyState || 
                       /loaded|complete/.test(script.readyState)){
                           // Handle memeory leak in IE
                           script.onload = script.onreadystatechange = null;
                           
                           // Remove the script
                           if(script.parentNode){
                               script.parentNode.removeChild(script);
                           }
                           
                           // Dereference the script
                           script = null;
                           
                           // Callback if not abort
                           if(!isAbort){
                               callback(200,'success');
                           }
                       }
                   };
                   
                   // Cicumvent IE6 bugs with base elements (#2709 and #4378) by prepending
                   // Use native DOM manipulation to avoid our domManip AJAX trickery
                   head.insertBefore(script,head.firstChild);
               },abort: function(){
                   if(script){
                       script.onload(undefined,true);
                   }
               }
           };
       });

需求场景:借助 ajaxSetup 新增 dataType.

  1. 项目需求:需要从服务器获取 yaml 文件,然后解析该文件

  2. 简单演示:
    解决方案:

    function parseYaml(text){
           console.log('You are parsing yaml file!');
           return 'yaml' + text + 'yaml';
       }
       $.ajaxSetup({
           accepts: {
               yaml: 'application/x-yaml,text/yaml'
           },contents: {
               yaml: /yaml/
           },converters: {
               'text yaml': function(text){
                   return parseYaml(text);
               }
           }
       });

    测试代码:

    // 发送 dataType 为 yaml 的请求
       $.ajax({
           url: 'http://google.com/helloworld.yaml',dataType: 'yaml',success: function(data){
               console.log(data);
           }
       });

需求场景:借助 ajaxPrefilter 来自定义扩展功能。

  1. 项目需求:防止 ajax 请求的重复提交

  2. 简单演示:
    解决方案:
    var pendingRequests = {};

    function storePendingRequest(key,jqXHR){

    pendingRequests[key] = true;
       jqXHR.pendingRequestKey = key;

    }

    function generatePendingRequestKey(options){

    return (options.type + options.url + options.dataType).toLowerCase().replace(/[^a-z0-9]/g,'');

    }
    $.ajaxPrefilter(function( options,originalOptions,jqXHR ) {

    // 不重复发送相同请求
       var key = generatePendingRequestKey(options);
       if (!pendingRequests[key]) {
           storePendingRequest(key,jqXHR);
       } else {
           // or do other
           jqXHR.abort();
       }
       
       var complete = options.complete;
       options.complete = function(jqXHR,textStatus) {
           // clear from pending requests
           pendingRequests[jqXHR.pendingRequestKey] = null;
           
           if ($.isFunction(complete)) {
               complete.apply(this,arguments);
           }
       };

    });

    测试代码:
    for(var i = 0; i < 10; i++){

    var j = 0;
       $.ajax({
           url: 'http://js.passport.qihucdn.com/5.0.2.js',type: 'GET',dataType: 'HTML',complete: function(){
               console.log('complete:' + j++);
           }
       });

    }

ajax 源码解读之如何扩展 ajax 的功能的更多相关文章

  1. HTML实现代码雨源码及效果示例

    这篇文章主要介绍了HTML实现代码雨源码及效果示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. 解析html5 canvas实现背景鼠标连线动态效果代码

    流行的动态背景连线特效。今天小编通过实例代码给大家解析html5 canvas实现背景鼠标连线动态效果,感兴趣的朋友一起看看吧

  3. xcode – osx上的config.log是什么?它在哪里?

    任何人都可以解释’configure’是什么和做什么,一般可以找到config.log文件?

  4. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  5. 源码推荐:简化Swift编写的iOS动画,iOS Material Design库

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  6. swift皮筋弹动发射飞机ios源码

    这是一个款采用swift实现的皮筋弹动发射飞机游戏源码,游戏源码比较详细,大家可以研究学习一下吧。

  7. swift 写的app 源码,保存一下下

    http://www.topthink.com/topic/3345.htmlhttp://www.csdn.net/article/2015-01-09/2823502-swift-open-source-libs

  8. swift 源码网站 code4app

    http://code4app.com/ios/HTHorizontalSelectionList/54cb2c94933bf0883a8b4583http://123.th7.cn/code/DMPagerViewController_2522.html

  9. OpenStack Swift源码导读:业务整体架构和Proxy进程

    OpenStack的源码分析在网上已经非常多了,针对各个部分的解读亦是非常详尽。其中proxy是前端的业务接入进程。account、container和object目录分别是账户、容器和对象的业务处理逻辑进程。各个业务进程或模块之间的逻辑关系可以参考《OpenstackSwift简介》文中的架构图。在《OpenstackSwift简介》从理论上面介绍了具体的节点寻找过程。

  10. 源码推荐(7.21):顶部滑动菜单FDSlideBar,Swift版无限循环轮播图

    顶部滑动菜单FDSlideBarFDSlideBar是一个顶部滑动菜单,如常见的网易、腾讯新闻等样式。菜单间切换流畅,具有较好的体验性。测试环境:Xcode6.2,iOS6.0以上Swift版无限循环轮播图无限循环轮播图片点击代理可设置图片Url的数组Url和本地图片混合轮播测试环境:Xcode6.2,iOS7.0以上弹幕系统实现--QHDanumuDemo说明:QHDanmu文件夹下是主要的弹幕模块系统,QHDanmuSend文件夹下是简单的发射弹幕的界面。

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部