2013-03-21 127 views
2

有一堆有關如何刪除所有「特殊」處理程序從要素問題(如的onclick)刪除所有處理程序,或從一個元素清除所有事件等從所有元素

  1. How to remove all Click event handlers in Jquery
  2. Jquery: how to release all event handlers, dom changes?

這個問題有點寬泛。我們在IE7和IE8下面的asp.net網站面臨着巨大的內存泄漏,並且縮小這些泄漏的一個調整是解除頁面上所有元素的所有事件。基本上這個:

$('*').off(); 

現在,我們正在努力提高應用程序的性能,毫不奇怪,這個特定的行是熱點之一。

所以,問題是:有沒有什麼方法可以更有效地達到相同的結果(明確地從文檔中的所有元素中刪除所有處理程序)?

不走的選擇:

  • 「重新加載頁面」 - 內存泄漏保留這種方式。
  • 「每次你附加處理時間,你將它存儲在陣列」 - 有太多這樣的地方

我在想的是使用一些jQuery的內部(甚至非公開API)利用附加的處理程序來檢測元素。但它略高於我目前使用jQuery的能力。如果有幫助,我們將針對jQuery 1.7.1。

+0

我以前做過這個。我的解決方案是保留一個全局數組來存儲對元素的引用。所以每次我綁定一些東西的時候,我都會添加一個對數組的引用。然後,當我需要時,通過陣列循環並逐個解除綁定。它是一個乏味的解決方案。想知道更好的方法來做到這一點。 – AlexCheuk 2013-03-21 21:33:34

+0

@AlexCheuk,這可能很麻煩。我希望我們可以遍歷所有使用jQuery的文件,並修改處理程序附件以將處理程序附加到某個數組中......但實際上,我們有一個長期生活的產品,其中的附件遍佈數百個文件。幾乎沒有自動化測試。即使沒有考慮到開發工作,我們的QA團隊也會殺了我們,如果我們這樣做的話:)需要一個全球解決方案,不幸的是,蠻力不是一種選擇。 – J0HN 2013-03-22 01:26:03

回答

1

我想你可以創建類似於hasEvent的東西來檢測事件,但我懷疑你的問題比在沒有事件的元素上調用.off()更多地穿過DOM。你可以測試它來確保。

根據應用程序的性質,您可以通過調整選擇器來更精確地定位元素,從而獲得一些性能。
請參閱:http://www.artzstudio.com/2009/04/jquery-performance-rules/

另一個想法是override jQuery functions是添加事件處理程序,所以你可以填充你的供以後使用數組。它不需要修改你的數百個文件,但仍然會給你更直接的訪問權限以供日後操作。

+0

是的,實際上遍歷'$('*')'會比'off()'消耗更多的資源。調整選擇器已經過驗證,因爲我們有處理a,div,span,input,img,li,td,table,tr等的幾乎沒有用處 - 幾乎可以在頁面上使用任何類型的標記。更不用說類和ID :)。重載jQuery可能會訣竅,明天會嘗試。 – J0HN 2013-03-22 02:42:34