2012-07-11 135 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