昨天写了一篇关于监视页面动态生成元素问题的文章,引起了一些小小的争议,不过我从中学到了很多。
文章在这,《jQuery下实现等待指定元素加载完毕
当然 动态生成的节点元素 分很多种情况,这里我们只分析ajax取得数据后生成元素问题。

昨天有大侠在下面评论,我学到了两种方法,一是 ajaxSuccess 来监听,二是 DOMNodeInserted 来监听,
最终我选择了 ajaxSuccess 而不打算用 DOMNodeInserted 。
不是因为 DOMNodeInserted 不好,这个方法还是相当不错的,我以前都没见过,(先学习了,留着以后备用)
只是因为 DOMNodeInserted 对每个节点生成都响应一次,所以会有上百次上千次的判断,造成了不必要的浪费。
(PS:不知道我的理解是否正确,如果有不恰当的地方,还望各位大侠指出。)

所以我选择了 ajaxSuccess ,但是还有个问题,ajaxSuccess 与 $.ajax() 内的 success 方法,
以及 jQuery 1.5 以后推荐的 done 方法,执行的先后顺序是怎样的呢?
我们先来做一个简单的测试,代码如下

(function(){
var box = $("#ajaxtest .docs-room"); //测试数据显示区元素 $("#btn-send").click(function(){ //绑定发送按钮
box.html(""); //清空显示区 $("<p>").html( (new Date).toLocaleString() ).appendTo(box); //添加测试事件
$.ajax({
url: '/mvc/blog/news.aspx', //右侧 昵称,园龄 等数据页面
data: '{"blogApp":"' + currentBlogApp + '"}', //博客blogApp
type: 'post',
dataType: 'text',
contentType: 'application/json; charset=utf-8',
//从 url 到 contentType 这几行代码是博客园的,我直接拿过来用的。
success: function(data) { //请求成功后调用
$("<p>").html( "success [ " + $(data).eq(0).text() + " ]" ).appendTo(box);
},
complete: function(request) { //请求完成后调用
$("<p>").html("complete [ " + $(request.responseText).eq(0).text() + " ]" ).appendTo(box);
}
}).done(function(data) { //请求成功后调用(deferred对象的方法)
$("<p>").html("done success [ " + $(data).eq(0).text() + " ]" ).appendTo(box);
}).always(function(data) { //请求完成后调用(deferred对象的方法)
$("<p>").html("always complete [ " + $(data).eq(0).text() + " ]" ).appendTo(box);
});
}); $("#btn-clear").click(function(){ //清除数据
box.html("");
}); $(document).ajaxSuccess(function(evt, request){ //ajax监听,所有ajax请求成功都执行
$("<p>").html("ajaxSuccess [ " + $(request.responseText).eq(0).text() + " ]" ).appendTo(box);
}).ajaxComplete(function(evt, request){ //ajax监听,所有ajax请求完成都执行
$("<p>").html("ajaxComplete [ " + $(request.responseText).eq(0).text() + " ]" ).appendTo(box);
}); }());

下面是测试区,大家可以点击测试下。

测试控制区
-
测试数据显示区
 

发现执行顺序很有意思,always 竟然跑到 ajaxSuccess 前面去了。
与我原先预想的不太一样,后来看了 deferred对象 方面的文章才弄懂,
这里就不解释了,大家自己去找这方面的资料吧,不过 done 和 always 要1.5以后的版本才能使用,这点要注意下。

我们可以肯定的是 ajaxSuccess 会在 success 和 done 之后执行,那么可以肯定节点已经生成,
这时我们对这几个节点进行补丁处理即可,下面是我的代码,请各位大侠审查、

(function(){ //监听ajax事件
$(document).ajaxSuccess(function(evt, request, settings, data) { var patchs = { //页面补丁方法集,把需要补丁的页面名写到这就可以了。
CommentForm: function(){ //评论页面
$("#btn_comment_submit").removeClass("comment_btn").addClass("btn"); //提交按钮
},
sidecolumn: function(){//搜索所在的页面
$(".div_my_zzk").addClass("input-append"); //搜索框
$(".btn_my_zzk").removeClass("btn_my_zzk").addClass("btn"); //搜索按钮
}
} var _key = settings.url.split("/").pop().split(".").shift(); //取的ajax url的文件名
patchs[_key] && patchs[_key](); //如果有这个补丁,就应用补丁
});
})();

这样既不会导致太多次的判断,而且可以针对指定页面的请求进行补丁处理。
这是目前我能想到最好的方法了,如果还有更完美的方法,还望大侠赐教。:-)

jQuery下ajax事件的简单分析的更多相关文章

  1. jquery get ($.get) 事件用法与分析

    jquery get ($.get) 事件用法与分析 get() 方法通过远程 HTTP GET 请求载入信息.这是一个简单的 GET 请求功能以取代复杂 $.ajax .请求成功时可调用回调函数.如 ...

  2. jQuery中Ajax事件beforesend及各参数含义1

    jQuery中Ajax事件beforesend及各参数含义 转自:http://blog.sina.com.cn/s/blog_609f9fdd0100wprz.html Ajax会触发很多事件. 有 ...

  3. jQuery全局Ajax事件处理器

    1.  .ajaxComplete( handler(event, XMLHttpRequest, ajaxOptions) ) 每当一个Ajax请求完成,jQuery就会触发ajaxComplete ...

  4. jQuery中Ajax事件顺序及各参数含义

    Ajax会触发很多事件.有两种事件,一种是局部事件,一种是全局事件: 局部事件:通过$.ajax来调用并且分配. $.ajax({ beforeSend: function(){ // Handle ...

  5. jQuery中Ajax事件beforesend及各参数含义

    Ajax会触发很多事件. 有两种事件,一种是局部事件,一种是全局事件: 局部事件:通过$.ajax来调用并且分配. $.ajax({ beforeSend: function(){ // Handle ...

  6. IE6/IE7/IE8 JQuery下resize事件执行多次的解决方法

    在使用jQuery的resize事件时发现每次改变浏览器的窗口大小时resize时间会执行两次,百度搜索了一下找到一个解决的方法,使用setTimeout来解决这个问题代码如下: var resize ...

  7. jQuery EasyUI Datagrid VirtualScrollView视图简单分析

    大家都知道EasyUI的Datagrid组件在加载大数据量时的优势并不是很明显,相对于其他一些框架,如果数据量达到几千,便会比较慢,特别是在IE下面.针对这种情况,我们首要做的是要相办法优化datag ...

  8. jquery load ($.load) 事件用法与分析(转)

    首先我们需要清楚的是jquery load方法是对jQuery.ajax()进行封装以方便我们使用的一个方法,当我们需要处理较为复杂的逻辑时候,还是需要用到jQuery.ajax()这个比较全面的方法 ...

  9. ***Jquery下Ajax与PHP数据交换

    一.前台传递字符串变量,后台返回字符串变量(非json格式) Javascript代码: 这里,为了解决Ajax数据传递出现的汉字乱码,在字符串传递之前,使用javascript函数escape()对 ...

随机推荐

  1. Loadrunner 面试常见问题

    三大组件: 脚本生成器,录制和调试脚本 . 控制台,设置运行和资源场景 结果分析器,将测试结果数据以不同的图表呈现,便于性能分析 工作原理: 录制:根据不同协议,记录下客户端和服务器二者之间的对话,生 ...

  2. 百度Hr分享,一个合格的数据工程师简历中必备技能?

    如果你是一名数据科学方面的求职者,你肯定想知道在简历上写些什么才能获得面试的机会:如果你想进入这个领域,你一定想知道具备哪些技术才能成为一名有竞争力的求职者. 在本文中,我们对Indeed中一千份数据 ...

  3. LAXCUS大数据操作系统节点挂掉后的处理

    昨天回公司加班跑一个LAXCUS大数据应用,JVM直接挂了,没有留下任何异常信息,查看代码,也没有内存泄漏的问题.百思不得姐,只好去求教LAXCUS大数据操作系统的技术客服,客服查看了故障节点配置.日 ...

  4. 原生 JavaScript 实现 AJAX、JSONP

    相信大多数前端开发者在需要与后端进行数据交互时,为了方便快捷,都会选择JQuery中封装的AJAX方法,但是有些时候,我们只需要JQuery的AJAX请求方法,而其他的功能用到的很少,这显然是没必要的 ...

  5. uc浏览器app点评

    uc浏览器app我经常用,是我接触的第一款手机浏览器,感觉还不错的,uc浏览器新闻更新速度有点慢,有时候还闪退,以前在搜索栏粘贴文字后,如果想改后面的文字,根本就不行,用uc浏览器下东西速度比较慢,现 ...

  6. Linux内核分析——计算机是如何工作的

    马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.计算机是如何工作的 ( ...

  7. Linux内核分析第四周总结

    用户态,内核态和中断处理过程 库函数将系统调用封装起来 用户态和内核态的差别: 在内核态时,cs和eip的值可以是任意地址,但在用户态时只能访问0x00000000 - 0xbfffffff,0x00 ...

  8. LeetCode 633. 平方数之和

    题目: 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c.     示例1: 输入: 5 输出: True 解释: 1 * 1 + 2 * 2 = 5 示例2 ...

  9. 小组成员的github地址

    袁颖https://github.com/joanyy/test 魏晓 https://github.com/weixiaohaobaobao/test 张晓磊 https://github.com/ ...

  10. 以webService为客户端获取List泛型结果集

    首先搭建好webService,添加XFire1.2Core Libraries 和XFire1.2HTTP Client Libraries,连接上数据库,下例以oracle为数据库. 连接Oral ...