2012-07-11 80 views
3

我有一大堆的div每个包含附加与下面的click事件的删除链接:jQuery覆盖事件侦听器吗?

var observeRemoveRoom = function 
    $('.remove_room').click(function(){  
     $(this).parent().removeClass('active'); 
    }); 
    } 

点击它消除了“活动”类的父(股利)的。我在window load上调用了这个observeRemoveRoom函数,它工作正常。

事情是,我有另一个功能,增加更多的相同的divs。由于包含在新div中的'a.remove_room'链接不在window.load上,所以我需要调用observeRemoveRoom。

我是不知何故重复事件处理程序? Jquery会覆盖它们吗?如果是这样,我应该解除处理程序?

回答

3

每次打电话observeRemoveRoom jQuery将为click事件添加一个新的唯一事件处理函数。

所以,是的,你需要.unbind()要么所有当前绑定的处理程序通过只调用.unbind()没有参数,或者是特定的,并通过在一个函数引用。

1

是的,如果您再次致电observeRemoveRoom,您将复制事件处理程序,但它可能不会引人注意,因为您只调用removeClass方法,如果找不到该类,则会发生什么情况,第一个监听者被触发。

相反,你可以取消绑定,每一次重新绑定click事件,如:

var observeRemoveRoom = function(){ 
    var remove_class = function(){  
     $(this).parent().removeClass('active'); 
    }; 
    $('.remove_room').off('click', remove_class).on('click', remove_class); 
    } 

虽如此,但建议您这样做此function`外面,而不是绑定和解除绑定事件每一次,如:

$(document).ready(function(){ 
    var remove_class = function(){  
     $(this).parent().removeClass('active'); 
    }; 
    // If the element exists at dom ready, you can bind the event directly 
    $('.remove_room').on("click", remove_class); 
    // If the element is added in dynamically, you can [delegate][1] the event 
    $('body').on("click", '.remove_room', remove_class); 
    // Note: Although I've delegated the event to the body tag in this case 
    // I recommend that you use the closest available parent instead 
}); 

http://api.jquery.com/on/#direct-and-delegated-events:[1]

1

你可以尝试实况查询,让他们更新:http://docs.jquery.com/Plugins/livequery

+1

呵呵,那个插件是什么?只需在选择器上使用()。 – Bergi 2012-07-11 10:55:59

+0

on()只会在您调用它时将事件附加到查询的结果中。实时查询在DOM更改时添加/删除事件。 – mamapitufo 2012-07-11 11:03:08

+2

不,当DOM改变时,但是当一个jQuery方法被调用时。 Urghh。更好地使用[委托事件](http://api.jquery.com/on/#direct-and-delegated-events)。 – Bergi 2012-07-11 11:14:33