博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jquery之重写(扩展)$.ajax和$.fn.load等方法详解
阅读量:7062 次
发布时间:2019-06-28

本文共 3297 字,大约阅读时间需要 10 分钟。

hot3.png

前言:

        今天做东西,考虑用户最好的体验,要实现界面上异步请求数据的loading效果,功能代码都是别人写完的,大概几十个地方,用的都是jQuery的load方法。咋整啊,总不能挨个去每个方法里面加效果吧,几十个地方呢。思来想去,只能用重写了,嘛也不说了,开干。

        作为一名资深小白,之前从未重写过jQuery的方法,依托着度娘,外加又看了看jquery的源码,终于把问题解决了。所以以此博文,来小总结下学到的知识亦或帮助“同病相怜”的人,部分资源摘自网络,如有纰漏,还望海涵并指出。

 

一、前提知识

往下翻页之前,有必要了解以下知识:

1. (function($){….})(jQuery)

 

        第一个括号里边的function($){….}实际上就是一个匿名函数,它的形参是$,这很奇怪,其实这里主要是为了不与其它的库冲突。我们在调用函数的时候,通常都是函数名后边加上括号以及实参,但是由于操作符的优先级我们定义的匿名函数也需要用()括起来,所以就有了前面的(function($){....})。

       现在这句代码什么意思大家应该很清楚了:第一个括号表示定义了一个匿名函数,然后(jQuery)表示为该函数传递的参数,整个结合起来意思就是,定义了一个匿名函数,然后又调用该函数,并传递实参jQuery,相当于——function fun($){…};fun(jQuery);

       这种方法多用于存放开发的插件,执行其中的代码时,Dom对象并不一定加载完毕。于此相反的是$(function(){}),这种方法在使用时页面的Dom对象已经加载完毕了。事实上该方法的全写是:$(document).ready(function(){});

 

2.$.fn.extend和$.extend

 

 

jQuery为开发插件提拱了两个方法,分别是:

jQuery.fn.extend(object);//为jQuery的实例对象添加方法

jQuery.extend(object);//为jQuery类本身扩展,添加新的方法或覆盖原有的方法

 

(1)$.fn.extend

在jQuery中有如下源码:

 

jQuery.fn = jQuery.prototype = {     init: function( selector, context ) {//....      //......  };  

        由此看来jQuery.fn=jQuery.prototype,然而prototype是什么呢?

 

        在 JavaScript 中,每个函数对象都有一个默认的属性 prototype,称为函数对象的原型成员,这个属性指向一个对象,称为函数的原型对象,当我们每定义了一个函数的时候,JavaScript 就创建了一个对应的原型对象,也就是说,当我们定义一个函数的时候,实际上得到了两个对象,一个函数对象,一个原型对象。原型对象是一个特殊的对象,函数的 prototype 成员指向它的原型对象,可以通过函数对象的 prototype 成员取得这个原型对象的引用。

 

        所以fn表示的就是原型对象,而extend表示扩展,所以$.fn.extend表示的是为原型对象扩展方法,使用此方式扩展的方法只能用对象去调用,example:

 

$.fn.extend({      test:function(){          alert("test");      }  });    $("#id").test();  

 

(2)$.extend

此方式则表示为jQuery类添加类方法(虽然jQuery没有类的概念,但用类来理解似乎简单了不少),或者直接理解为添加静态方法,然后就可以直接用$在其他地方来调用此扩展方法了,example:

$.extend({      test:function(param){          alert(param);      }  });  $.test(1);//则直接弹出1  

 

3. JavaScript的闭包

闭包是js的难点也是js的特色,很多高级应用都要依靠闭包来实现,网络资源很多,在这里不在赘述,最好也去了解下。

4.JavaScript的apply方法以及call方法

这两个概念也是有必要知道的,详见我转载的文章:

二、重写方法

1.重写$.ajax方法

(function($){      //首先备份下jquery的ajax方法      var_ajax=$.ajax;             //重写jquery的ajax方法      $.ajax=function(opt){          //备份opt中error和success方法          var fn = {              error:function(XMLHttpRequest, textStatus, errorThrown){},              success:function(data, textStatus){}          }          if(opt.error){              fn.error=opt.error;          }          if(opt.success){              fn.success=opt.success;          }                     //扩展增强处理          var_opt = $.extend(opt,{              error:function(XMLHttpRequest, textStatus, errorThrown){                  //错误方法增强处理                  fn.error(XMLHttpRequest, textStatus, errorThrown);              },              success:function(data, textStatus){                  //成功回调方法增强处理                  fn.success(data, textStatus);              },              beforeSend:function(XHR){                  //提交前回调方法                  $('body').append("
正在加载,请稍后...");              },              complete:function(XHR, TS){                  //请求完成后回调函数 (请求成功或失败之后均调用)。                  $("#ajaxInfo").remove();;              }          });          return _ajax(_opt);      };  })(jQuery);  

 

2.重写$.load方法

//同样先备份下jquery的load方法  var _load=$.fn.load;  $.fn.extend({      load:function(url,param,calbck){          //其他操作和处理      //..      //此处用apply方法调用原来的load方法,因为load方法属于对象,所以不可直接对象._load(...)          return _load.apply(this,[url,param,calbck]);      }  });  

 

转载于:https://my.oschina.net/u/3696256/blog/1580893

你可能感兴趣的文章
首席技术官 (CTO) 比普通程序员强在哪
查看>>
《交互式程序设计 第2版》一1.4 艺术与交互
查看>>
《脱颖而出——成功网店经营之道》一2.2 进货攻略
查看>>
X.Org 可能将失去它的域名 x.org
查看>>
《Adobe Photoshop CC经典教程(彩色版)》—第4课4.2节概述
查看>>
互联网企业安全高级指南3.1 从零开始
查看>>
后台权限管理的菜单设计
查看>>
linux搭建git服务器
查看>>
【原创】Percona 之 tcprstat 安装及使用
查看>>
oracle中drop后的表清楚表的含义
查看>>
js笔记——js数据类型转换
查看>>
Hadoop2.5.2集群部署(完全分布式)
查看>>
禁止sshd暴力尝试方案
查看>>
PHP数组
查看>>
rundeck创建普通apitoken
查看>>
./sdb devices ???????????? no permissions
查看>>
8月共处理钓鱼网站1862个:非CN域名达1855个
查看>>
网络数据安全
查看>>
五子棋局域网对战项目(下)
查看>>
微服务架构—优雅停机方案
查看>>