2010-06-01 118 views
8

我有一個ajax應用程序,將運行每個交互功能。我希望能夠每次運行我的設置功能,以便我的所有設置代碼保持封裝。然而,綁定元素不止一次意味着處理程序將運行多次,這顯然是不可取的。有沒有一種優雅的方式在jQuery中多次調用一個元素上的綁定而不會多次調用這個處理函數?在jQuery中,有沒有辦法只綁定一次點擊?

回答

8

你可以用one()功能的事件附加到document

$(document).one('click', function(e) { 
    // initialization here 
}); 

一旦運行,該事件處理程序再次刪除,因此不會再次運行。但是,如果您需要初始化以在之前運行某個其他元素的點擊事件,我們將不得不考慮其他元素。然後,使用mousedown而不是click可能會奏效,因爲mousedown事件在點擊事件之前觸發。

+0

你錯過了'';'在那裏。 – Ben 2010-06-01 04:14:02

+0

謝謝本,修理... – 2010-06-01 04:15:36

+0

不知道這個。 – DMin 2010-06-01 04:27:31

12

用戶jQuery one函數像Tom說的那樣,但是每次綁定之前都要綁定處理程序。它有助於將事件處理程序分配給一個變量,而不是使用匿名函數。

var handler = function(e) { // stuff }; 

$('#element').unbind('click', handler).one('click', handler); 

//elsewhere 
$('#element').unbind('click', handler).one('click', handler); 

您還可以做.unbind('click')刪除所有附加到元素的點擊處理程序。

1

Chetan Sastry的答案就是你想要的。基本上只需調用$(元素).unbind(event);在每個事件之前。

所以,如果你有一個像loadAllButtonClicks(功能),它包含所有你的頁面上的每個按鈕的

$(element).on("click", function(){}); 

方法,並在運行,每一個按鈕被點擊的時間,這顯然會產生超過每個按鈕一個事件。爲了解決這個問題之前每

$(element).on("click", function(){}); 

添加

$(element).unbind(event); 

,它會解除綁定所有事件到該元素,然後添加一個click事件。

2

如果解除綁定不起作用,也可以使用.off()。確保給.off選擇和事件最初提供的。對()中的那些完全一致:

$("div.selector").off("click", "a.another_selector");  
$("div.selector").on("click", "a.another_selector", function(e){ 

這是我在解決同阿賈克斯重裝問題什麼工作。

+0

我喜歡這個,因爲$(元素).unbind(event);解決方案將從元素中刪除所有類型的事件(例如點擊),而這種方法只是刪除與所選擇的問題相關的事件,即使它們共享相同的事件類型,也會留下其他事件。 – 2015-01-18 17:06:02

相關問題