/*重写Jquery中的ajax 封装壳*/
$(function () {
(function ($) {
//首先备份下jquery的ajax方法
var _ajax = $.ajax; //重写jquery的ajax方法
$.ajax = function (opt) {
//备份opt中error和success方法
var fn = {
beforeSend: function (XHR) { },
error: function (XMLHttpRequest, textStatus, errorThrown) { },
success: function (data, textStatus) { },
complete: function (XHR, TS) { }
} if (opt.beforeSend) {
fn.beforeSend = opt.beforeSend;
}
if (opt.error) {
fn.error = opt.error;
}
if (opt.success) {
fn.success = opt.success;
}
if (opt.complete) {
fn.complete = opt.complete;
} //扩展增强处理
var _opt = $.extend(opt, {
//全局允许跨域
xhrFields: {
withCredentials: true
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
//错误方法增强处理
fn.error(XMLHttpRequest, textStatus, errorThrown);
},
success: function (data, textStatus) {
//成功回调方法增强处理
fn.success(data, textStatus);
},
beforeSend: function (XHR) {
//提交前回调方法
fn.beforeSend(XHR);
},
complete: function (XHR, TS) {
//请求完成后回调函数 (请求成功或失败之后均调用)。
fn.complete(XHR, TS);
}
});
if (opt.xhrFields) {
_opt.xhrFields = opt.xhrFields;
} //调用native ajax 方法
return _ajax(_opt);
};
})(jQuery);
});

jquery之重写(扩展)$.ajax和$.fn.load等方法详解

 
        今天做东西,考虑用户最好的体验,要实现界面上异步请求数据的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中有如下源码:

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

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

        在 JavaScript 中,每个函数对象都有一个默认的属性 prototype,称为函数对象的原型成员,这个属性指向一个对象,称为函数的原型对象,当我们每定义了一个函数的时候,JavaScript 就创建了一个对应的原型对象,也就是说,当我们定义一个函数的时候,实际上得到了两个对象,一个函数对象,一个原型对象。原型对象是一个特殊的对象,函数的 prototype 成员指向它的原型对象,可以通过函数对象的 prototype 成员取得这个原型对象的引用。
 
        所以fn表示的就是原型对象,而extend表示扩展,所以$.fn.extend表示的是为原型对象扩展方法,使用此方式扩展的方法只能用对象去调用,example:
 
  1. $.fn.extend({
  2. test:function(){
  3. alert("test");
  4. }
  5. });
  6. $("#id").test();

(2)$.extend

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

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

3. JavaScript的闭包

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

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

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

二、重写方法

1.重写$.ajax方法

  1. (function($){
  2. //首先备份下jquery的ajax方法
  3. var_ajax=$.ajax;
  4. //重写jquery的ajax方法
  5. $.ajax=function(opt){
  6. //备份opt中error和success方法
  7. var fn = {
  8. error:function(XMLHttpRequest, textStatus, errorThrown){},
  9. success:function(data, textStatus){}
  10. }
  11. if(opt.error){
  12. fn.error=opt.error;
  13. }
  14. if(opt.success){
  15. fn.success=opt.success;
  16. }
  17. //扩展增强处理
  18. var_opt = $.extend(opt,{
  19. error:function(XMLHttpRequest, textStatus, errorThrown){
  20. //错误方法增强处理
  21. fn.error(XMLHttpRequest, textStatus, errorThrown);
  22. },
  23. success:function(data, textStatus){
  24. //成功回调方法增强处理
  25. fn.success(data, textStatus);
  26. },
  27. beforeSend:function(XHR){
  28. //提交前回调方法
  29. $('body').append("<div id='ajaxInfo' style=''>正在加载,请稍后...</div>");
  30. },
  31. complete:function(XHR, TS){
  32. //请求完成后回调函数 (请求成功或失败之后均调用)。
  33. $("#ajaxInfo").remove();;
  34. }
  35. });
  36. return _ajax(_opt);
  37. };
  38. })(jQuery);

2.重写$.load方法

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

重写$.ajax方法的更多相关文章

  1. $.ajax()方法详解

    jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(p ...

  2. 重写jquery的ajax方法

    //首先备份下jquery的ajax方法 var _ajax=$.ajax; //重写jquery的ajax方法 $.ajax=function(opt){ //备份opt中error和success ...

  3. ajax方法总结

    ajax方法总结 1.原生ajax get请求和post请求区别:黄色小三角 以get请求为例,输出结果如下: 2.jquery中的ajax 列了常用的6个方法: 3.状态说明 readystate: ...

  4. 重写ajax方法实现异步请求session过期时跳转登录页面

    jQuery(function($){ // 备份jquery的ajax方法 var _ajax=$.ajax; // 重写ajax方法, $.ajax=function(opt){ var _suc ...

  5. jquery中$.ajax方法提交表单

    function postdata(){                        //提交数据函数 $.ajax({                                //调用jqu ...

  6. Ajax方法封装

    打算自己封装一个ajax方法,再不用jq库的情况下,直接引用: ajax作用:数据交互,在不刷新页面的情况下,发送请求,获取数据: 首页第一步常见一个ajax对象:XMLHttpRequest,之后会 ...

  7. 各种AJAX方法的使用比较

    转:http://www.cnblogs.com/fish-li/archive/2013/01/13/2858599.html#_label6 AJAX技术经过这么多年的发展,出现了一些框架或类库用 ...

  8. MVC中使用Ajax提交数据 Jquery Ajax方法传值到action

    Jquery Ajax方法传值到action <script type="text/javascript"> $(document).ready(function(){ ...

  9. 再谈Jquery Ajax方法传递到action 【转载】

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://cnn237111.blog.51cto.com/2359144/984466 之 ...

  10. 【转】Jquery ajax方法解析返回的json数据

    转自http://blog.csdn.net/haiqiao_2010/article/details/12653555 最近在用jQuery的ajax方法传递接收json数据时发现一个问题,那就是返 ...

随机推荐

  1. C#获取路径

    System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. System.Environment.Cu ...

  2. TensorFlow queue多线程读取数据

    一.tensorflow读取机制图解 我们必须要把数据先读入后才能进行计算,假设读入用时0.1s,计算用时0.9s,那么就意味着每过1s,GPU都会有0.1s无事可做,这就大大降低了运算的效率. 解决 ...

  3. Rookey.Frame v1.0快速开发平台-整体介绍

    Rookey.Frame v1.0是一套基于.NET MVC的极速开发框架,支持简单逻辑模块零代码编程.支持二次开发,具有高扩展性.高复用性.高伸缩性. 框架特点 (1)简单逻辑模块实现零代码编程,通 ...

  4. 关于final中的几个忽略的点的再次阐述

    final : 最终.作为一个修饰符,可以感性的认识,但是总是在背后会忽略特殊的角落. 1,可以修饰类,函数,变量. 2,被final修饰的类不可以被继承.为了避免被继承,被子类复写功能. 这一个点容 ...

  5. Cocos2d-X开发教程-捕鱼达人 Cocos2-x development tutorial - fishing talent

    Cocos2d-X开发教程-捕鱼达人 Cocos2-x development tutorial - fishing talent 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱 ...

  6. BZOJ.3598.[SCOI2014]方伯伯的商场之旅(贪心 数位DP)

    题目链接 先考虑,对于确定的一个数,怎样移动代价最少(或者移到哪个位置最优)? 假设我们都移到下标\(1\)位置(设集合点为\(1\)),那么移动到下标\(2\)与\(1\)相比代价差为:\(下标&l ...

  7. [CC-LONCYC]Lonely Cycles

    [CC-LONCYC]Lonely Cycles 题目大意: \(T(T\le1000)\)组数据. 给定一张简单图(不含重边与自环),图中有\(n(n\le2\times10^5)\)个节点和\(m ...

  8. Flask的使用2

    1.Flask文件的配置 # 方式一: # 直接书写 app.config['SESSION_COOKIE_NAME'] = 'session_lvning' # 方式二: #引入setting.py ...

  9. iOS主流机型更新

    主流机型更新后,舍弃了原有的iPhone 4 ,iPhone 4s, iPhone 5 ,iPhone 5s.增加了iPhone X,iPhone 8和iPhone 8 plus. 总体上屏幕趋于一个 ...

  10. Android笔记(四):RecyclerView

    RecyclerView是ListView的增强版.有了它之后,你就可以抛弃ListView了. recycle,重复利用.在ListView里,我们得自己写重复利用View的代码,而Recycler ...