使用live delegate on来解决js对后加载的html失效的问题

今天要写一个前端的东西。每多学一点知识,就可以少写几行代码、几十行代码、几个文件量的代码……这是真的。一直对前端的研究都是停留在遇到问题百度谷歌答案的做法。今天遇到这样一个问题:已经写好的js代码,对ajax加载的html失效了。

用好几组关键字都没有找到答案,最后这组帮我找到了解答的办法:

javascript not work on ajax content

很幸运,我来到了:http://stackoverflow.com/questions/10161938/jquery-function-not-working-on-ajax-loaded-content

有经验的人回答了:

When you initially created the .click() handler, that second button was not yet in the DOM, so jQuery could not attach an event handler to it. The .live() function will work for any element that is already
in the DOM and also any element that will be added in the future (e.g. from an ajax call).

就是说,live可以将事件绑定到已经加载或没有加载的DOM里。

将原来写的

jQuery(‘.ajaxCommentMiniList a‘).click(function(){

alert(123);

return false;

});

改成:

jQuery(‘.ajaxCommentMiniList a‘).live(‘click‘, function(){

alert(123);

return false;

});

即可。网上不少文章建议使用delegate而不是live,甚至还有on。

http://stackoverflow.com/questions/4579117/jquery-live-vs-delegate

This, however, seems to me to be much more explicit about what is actually happening. You don‘t realise from the live example that the events are actually being captured on document; with delegate,
it is clear that the event capturing happens on #containerElement. You can do the same thing with live, but the syntax becomes increasingly horrid.

Specifying a context for your events to be captured also improves performance. With the live example, every single click on the entire document has to be compared with the selector a.myClass to see if it matches. With delegate, that is only the elements within
#containerElement. This will obviously improve performance.

Finally, live requires that your browser looks for a.myClass whether or not it currently exists. delegate only looks for the elements when the events are triggered, giving a further performance advantage.

NB delegate uses live behind the scenes, so you can do anything with live that you can do with delegate. My answer deals with them as they are commonly used.

Note also that neither live nor delegate is the best way to do event delegation in modern jQuery. The new syntax (as of jQuery 1.7) is with the on function. The syntax is as follows:

$(‘#containerElement‘).on(‘click‘, ‘a.myClass‘, function() { ... });

看来on是更好的解决方案。于是我最后的代码改为:

jQuery(‘.ajaxCommentMiniList‘).on(‘click‘, ‘.pagination a‘,function(){

		ajaxCommentMiniList.clickAction(jQuery(this));
		return false;
	});

找个时间研究一下:live VS delegate VS on。希望本文帮到部分遇到与我同样问题的朋友。

使用live delegate on来解决js对后加载的html失效的问题,布布扣,bubuko.com

时间: 2024-10-27 04:57:07

使用live delegate on来解决js对后加载的html失效的问题的相关文章

nginx实现动态分离,解决css和js等图片加载问题

改帖专门为使用nginx,通过nginx把请求转发到web服务器再返回客户端的时候,解决css和js和图片加载不出来的问题. 如果没安装nginx,请访问一下地址进行安装 <a href="http://www.cnblogs.com/sz-jack/p/5200283.html">http://www.cnblogs.com/sz-jack/p/5200283.html</a>

js文件最后加载(在window.load事件发生后再加载js文件),用于解决因jQuery等js库导致网页加载慢的问题

需引入文件:lazyload-min.js <script src="JS/lazyload-min.js" type="text/javascript"></script> 插入代码: function loadscript() { LazyLoad.loadOnce([ 'JS/touch.js', 'http://libs.baidu.com/jquery/1.2.3/jquery.min.js' ], loadComplete); }

实现异步加载js文件及加载完成后回调

模块化工具类实现方式 基于AMD.CMD模式的JS模块化管理工具越来越流行,这些工具通常只需在页面中加载对应的工具JS,其他JS文件都是异步加载的,比如RequireJS就可以象下面这样做. 首先在页面加载 <script data-main="scripts/main.js" src="scripts/require.js"></script> 然后工具会自动识别data-main属性值,并加载对应的JS文件,在main.js可以加载更多模

js的动态加载、缓存、更新以及复用(二)

上一篇发出来后得到了很多回复,在此首先感谢大家的热情捧场!有的推荐第三方框架,比如 In.js.requrieJS.sea.js.lab.js等.这个开阔了眼界,以前只知道sea.js,省去了自己搜索的麻烦.也用了点时间简单看了一下,因为每一个都是大块头,都有自己的理念,如果只是简单使用的话,那么谁便找一个就可以了,但是我习惯把原理弄清楚.因为我觉得虽然不知道原理也可以使用,但是知道了原理后,可以用的更好. 主要看的是sea.js,目前简单的理解是:一个加载js的机制 + 模块化编程(CMD规范

js的动态加载、缓存、更新以及复用(一)

使用范围: OA.MIS.ERP等信息管理类的项目,暂时不考虑网站. 遇到的问题: 完成一个项目,往往需要引用很多js文件,比如jQuery.js.easyUI等.还有自己写的一些列js文件,那么这些文件如何方便的加载,如果文件有变化如何才能让客户端及时更新缓存?如果能够提高点运行效率,那就更好了. 目标: 1.  可以方便的引用js文件. 2.  尽量使用各种缓存,避免频繁从服务器读取文件. 3.  如果js文件有更新或者增加.减少几个减少js文件,需要客户端能够自动.立刻更新. 4.  Js

高性能js之js文件的加载与解析

随着网站的发展,现在的网页已经离不开js,经常一个页面会引入大量的js.那么该如何合理的加载这些js? head标签中引入js文件可能是最常见的一种方式,但是这样会造成一个问题.因为j可以说是浏览器中的霸主,换句话说在js的引入和解析过程中页面是不会进行加载和渲染的.那么如果js加载的时间过长,就会造成页面一段时间的空白,这样的用户体验无疑是很差的.下图是引入head中js和css时的加载过程. 从上图可以看到加载和解析每个js文件时都会耗费一定的时间,而这段时间不能同时进行别的事情,显然这种情

js判断图片加载完成后获取图片实际宽高

通常,我们会用jq的.width()/.height()方法获取图片的宽度/高度或者用js的.offsetwidth/.offsetheight方法来获取图片的宽度/高度,但这些方法在我们通过样式设置了图片的宽高后获取的就不是图片的实际宽高,这显然在有些时候不是我们想要的结果,那么有没有一种方法来获取这样的实际宽高呢?答案是有的.下面的代码就能解决这样的问题: <img src="01.jpg" id="test" width="250px"

减少JS对页面加载性能影响的方法以及无阻塞脚本(javascript)模式

JS的阻塞特性:当<script>出现的时候,页面必须等待脚本文件的加载.解析.执行完毕后才能继续进行页面的渲染.不管脚本文件是以内联形式还是外部引入的形式出现在<script>中,页面的加载和渲染都必须停下来等待脚本文件的执行完成.因为在脚本文件中可能会修改页面的内容.这就会出现一个问题,当HTML文件中引入很多的外部脚本文件和内联脚本时,可能会导致页面的严重阻塞,影响页面的加载和渲染,用户体验特别的差.因而需要寻找适当的方法来减小脚本文件对页面加载带来的影响. 改善性能的几种方

html、css、js三者的加载顺序

页面的加载顺序时从上往下加载的: 1.DOM树加载到llink标签 css文件的加载和DOM树的加载是可以同时进行的,也就是说,css在加载时DOM树还在继续构建. 这个过程中如果遇到css样式或者img,会向服务器发送一个请求,待资源返回后,将其添加到DOM中的相应位置. 2.DOM树加载到script标签 由于JS是单线程模式,因此不会与DOM并行加载,因此需要等到整个js文件加载完后再继续加载DOM.倘若JS文件过大,则可能导致浏览器页面显示滞后,出现"阻塞效应". .JS阻塞其