2012-09-27 83 views
1

我在我正在處理的網頁上發現資源泄漏。jQuery點擊事件可以解除綁定或重置嗎?

此網頁有兩個文本框,單擊顯示模式對話框後,對後端執行數據請求,然後將該信息顯示在表中,用戶可以從中選擇一個條目用於它們最初點擊的文本框。

我綁定click事件的文本框,如下所示:

var $field = $('#one-of-the-text-fields'); 

$field.click(function() { 
     App.DialogClass.show(); 
     App.DialogClass.PopulateTable(); 
     App.DialogClass.GotoPageButtonAction(actionArgs); // Offender! 
}); 

...其中要求...

App.DialogClass = (function($) { 

var pub {}, 
    $gotoPage = $('#pageNumberNavigationField'), 
    $gotoPageButton = $('#pageNumberNavigationButton'); 

// ...SNIP unimportant other details... 

pub.GotoPageButtonAction = function (args) { 
    $gotoPageButton.click(function() { 
     var pageNumber = $gotoPage.val(); 
     pub.PopulateTable(args); // Breakpoint inserted here... 
    }); 
}; 

return pub; 

})(jQuery); 

我注意到泄漏,因爲當我通過使用Chrome的跑JavaScript調試器,每當我點擊一個不同的按鈕時,總是會有一個額外的斷點(例如,第一次點擊字段A時,斷點被擊兩次;當我點擊字段B時,斷點被擊中三次如果我點擊A後,斷點四次。根據需要外推。)

無處不在我的代碼中,我正在做任何有關給定字段的現有點擊事件。我懷疑我的泄漏源於事件沒有得到清理的事實。這就是說,我對JavaScript/jQuery也不是非常熟悉。什麼是從控件中刪除點擊事件的一些技巧?

+1

http://api.jquery.com/unbind/ –

+1

.unbind()? http://api.jquery.com/unbind/ – supernova

+0

[off()](http://api.jquery.com/off/)在更新的jquery版本 – fcalderan

回答

5

當然。只要他們解除綁定:

$field.unbind('click'); 

但是,請記住,這將刪除所有事件處理程序點擊,不只是你的。爲了安全起見,應結合處理程序時使用的命名空間:

$field.bind('click.mynamespace', function(){ 
    // do something 
}); 

然後,

$field.unbind('click.mynamespace'); 

這樣,那麼,只有您的處理程序將被刪除。

1

JQuery提供unbind函數來解除綁定事件偵聽器。

請注意,你也可以在香草JS使用removeEventListener來做。

但不是解除綁定,你可能不應該綁定每一個GotoPageButtonAction:一次就夠了。

+0

由於我正在處理的分頁系統的性質,我必須執行重新綁定,因爲後端中的請求取決於單擊的字段。點擊通常我不會執行重新綁定,但這種情況是一次性的。 –

3

如果你已經使用.bind()約束他們.unbind()刪除事件

如果你已經使用。對()約束他們.off()移除了事件