重写$.ajax方法

 1 /*重写Jquery中的ajax 封装壳*/
 2 $(function () {
 3     (function ($) {
 4         //首先备份下jquery的ajax方法
 5         var _ajax = $.ajax;
 6
 7         //重写jquery的ajax方法
 8         $.ajax = function (opt) {
 9             //备份opt中error和success方法
10             var fn = {
11                 beforeSend: function (XHR) { },
12                 error: function (XMLHttpRequest, textStatus, errorThrown) { },
13                 success: function (data, textStatus) { },
14                 complete: function (XHR, TS) { }
15             }
16
17             if (opt.beforeSend) {
18                 fn.beforeSend = opt.beforeSend;
19             }
20             if (opt.error) {
21                 fn.error = opt.error;
22             }
23             if (opt.success) {
24                 fn.success = opt.success;
25             }
26             if (opt.complete) {
27                 fn.complete = opt.complete;
28             }
29
30
31
32             //扩展增强处理
33             var _opt = $.extend(opt, {
34                 //全局允许跨域
35                 xhrFields: {
36                     withCredentials: true
37                 },
38                 error: function (XMLHttpRequest, textStatus, errorThrown) {
39                     //错误方法增强处理
40                     fn.error(XMLHttpRequest, textStatus, errorThrown);
41                 },
42                 success: function (data, textStatus) {
43                     //成功回调方法增强处理
44                     fn.success(data, textStatus);
45                 },
46                 beforeSend: function (XHR) {
47                     //提交前回调方法
48                     fn.beforeSend(XHR);
49                 },
50                 complete: function (XHR, TS) {
51                     //请求完成后回调函数 (请求成功或失败之后均调用)。
52                     fn.complete(XHR, TS);
53                 }
54             });
55             if (opt.xhrFields) {
56                 _opt.xhrFields = opt.xhrFields;
57             }
58
59             //调用native ajax 方法
60             return _ajax(_opt);
61         };
62     })(jQuery);
63 });

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中有如下源码:

[javascript] view plain copy

  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:

[javascript] view plain copy

  1. $.fn.extend({
  2. test:function(){
  3. alert("test");
  4. }
  5. });
  6. $("#id").test();

(2)$.extend

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

[javascript] view plain copy

  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方法

[javascript] view plain copy

  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方法

[javascript] view plain copy

  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. });

原文地址:https://www.cnblogs.com/micro-chen/p/9213833.html

时间: 2024-11-10 14:50:22

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

jquery ajax 方法及各参数详解

jquery ajax 方法及各参数详解 1.$.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数信息. 参数列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求方式 ("POST" 或 "GET"), 默认为 "GET".注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分

Juqyer:$.ajax()方法详解

Jquery中的ajax方法参数总是记不住,这里记录一下. 最常用的属性是:url.data 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持. 3.timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆盖$.ajaxSetup()方法的全局设置. 4.async: 

JQuery中$.ajax()方法参数详解

url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 delete也可以使用,但仅部分浏览器支持. timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆盖$.ajaxSetup()方法的全局设 置. async:要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求. 如果需要发送同步请求,请将此选项

ajax系列之用jQuery的ajax方法向服务器发出get和post请求

打算写个ajax系列的博文,主要是写给自己看,学习下ajax的相关知识和用法,以更好的在工作中使用ajax. 假设有个网站A,它有一个简单的输入用户名的页面,界面上有两个输入框,第一个输入框包含在一个form表单里用来实现form提交,第二个输入框是单独的.没有包含在form里,下面就用这两个输入框来学习下jQuery的ajax. 1,前端的html和javascript代码 页面html 1 <main style="text-align: center; margin: 200px a

jquery中$.ajax方法提交表单

function postdata(){                        //提交数据函数 $.ajax({                                //调用jquery的ajax方法 type: "POST",                       //设置ajax方法提交数据的形式 url: "ok.php",                      //把数据提交到ok.php data: "writer=

$.ajax()方法详解

jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持. 3.timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆盖$.ajaxSetup()方法的全局设置. 4.async: 要求为Boolean类型的参数,默

jQuery AJAX 方法

jQuery AJAX 方法 AJAX 是一种与服务器交换数据的技术,可以在补充在整个页面的情况下更新网页的一部分. 下面的表格列出了所有的 jQuery AJAX 方法: 方法 描述 $.ajax() 执行异步 AJAX 请求 $.ajaxPrefilter() 在每个请求发送之前且被 $.ajax() 处理之前,处理自定义 Ajax 选项或修改已存在选项 $.ajaxSetup() 为将来的 AJAX 请求设置默认值 $.ajaxTransport() 创建处理 Ajax 数据实际传送的对象

jquery中页面Ajax方法$.load的功能

load语法 $(".selector").load("url", function(responseText, statusText, xmlhttprequest)); 可以做到加载一个页面的时候,如果发生错误,根据statusText给出的状态,显示对应的提示,这对用户来说非常重要. 例子,load post 代码如下 复制代码 <div id=btnAjaxPost>点击我</div><div id=divResult>内

Jquery在unload中成功调用Jquery的.ajax方法

因为页面要求,需要在页面跳转的时候做一些数据的保存工作,试了很多次,发现Jquery的unload事件中调用.ajax方法,在FireFox中可以顺利执行,但是在Chromium下却返回了textStatus为error的消息.试验过很多方法,例如在页面离开时弹出确认框,这样虽然返回了error消息,但是数据库显示操作执行完毕.将确认框除去后,数据库依然没有响应. 查阅多方资料后,发现是以为.ajax的异步响应问题,把ajax请求改为同步的,问题解决. 代码如下: 1 $(window).unl

为什么struts2 ajax 方法执行两次

struts2中使用json插件执行ajax处理时,如果方法名是get方法的时候,方法会莫名其妙的执行两次. 原因: struts2 中JSON的原理是在ACTION中的get方法都会序列化,所以前面是get的方法只要没指定不序列化,都会执行解决方法 Action中的业务方法前别加get 或者 set(属性的get set 除外) 用@JSON(serialize=false)指定方法不序列化如import com.googlecode.jsonplugin.annotations.JSON;@