如何让jQuery事件监听器监听通过ajax调用加载的元素?
我通过ajax将注释加载到我的文档中.每个评论都有一个ajax删除按钮.对于最初加载文档的注释,我的功能正常.
但是任何新创建的注释或通过ajax检索的注释,事件列表器都不会对它们进行检测.
< a class =“comment-delete”href =“/ comments / delete / 124”> delete< / a>
- $(".comment-delete").click(function(e) {
- e.preventDefault();
- var $link = $(this),url = $link.attr('href');
- $.ajax(url,{
- dataType: 'json',beforeSend: function() {
- },error: function() {
- },success: function(data) {
- if (data.success) {
- $($link).parent().parent().hide();
- }
- }
- });
- });
解决方法
更新的答案
今天,执行此操作的适当方法是使用带有附加选择器的on方法.例如,如果我们想听取图像上的任何点击,我们可以这样做:
- $("img").on("click",function () {
- alert( "You clicked on " + this.src );
- });
对于运行此代码后添加到DOM的任何图像元素,这将不起作用.相反,我们需要使用事件委托,这意味着我们在冒泡阶段进一步处理DOM事件:
- $(document).on("click","img",function () {
- alert( "You clicked on " + this.src );
- });
在这种情况下,我们在文档级别处理事件,但前提是它所进行的元素与第二个“img”选择器匹配.因此,现在将处理任何图像,无论是最初在页面上还是在以后动态加载.
原始答案(2011年撰写)
$.live()
和$.delegate()
是您应该关注的两种方法.第一个将监听文档以查找与您的选择器匹配的任何新元素,第二个将为它应该监听的位置提供更精细的范围.
- $(".comment-delete").live("click",function(){
- // handle delete logic
- });
或者,更具体:
- $(".comments").delegate(".comment-delete","click",function(){
- // handle delete logic
- });