2014-04-09 123 views
3

我正在與一位開發人員討論我們在iOS設備上使用網絡應用時遇到的問題。它大量使用事件和jQuery。我們目前有這樣的問題,即應用程序在使用一段時間後運行緩慢。從DOM中刪除的元素解除綁定事件

我的同事提出問題是我們綁定了特定元素的事件處理程序,例如,

$("div#id123").on("click", function(....){....}); 

而且,因爲我們這樣做,每當我們加載新的元素到DOM,這些事件處理程序,最終「污染」的瀏覽器,使其慢。

只要載入新元素,舊的元素就是完全從DOM到$("div#id456").remove() d,直到它們可能再次加載(全新,沒有任何緩存)。

我不能反駁他,但我確信只要刪除舊元素,事件處理程序也會被瀏覽器刪除。畢竟,他爲什麼要保留它們?

他建議我重寫所有的處理程序有

$(document).on("click", "div.commonclass", function(....){...}); 

形式對文檔級別的事件處理程序,綁定到類的所有我們處理有共同的元素。

這對我來說意味着一些重大的改寫,我想避免在我看來,這不是我們問題的根本原因。

是否我對關於移除的元素的事件的假設是正確的?如果是這樣,我如何向我的同事展示重寫事件處理程序是不必要的浪費工作時間?

+0

使用'.remove()'也可以刪除任何綁定的句柄。根據建議使用委派將避免有許多處理程序,具體取決於多少元素。所以我建議你也試試它。現在你的問題可能來自其他地方 –

+0

使用.detach()而不是remove(),因爲.detach()充當刪除臨時但事件處理程序沒有刪除請嘗試它 –

回答

1

我發現,當您專門爲iOS應用程序使用javascript時,由於memeory開銷,使用jQuery時需要非常小心。我經常不得不在本地JavaScript中重新編寫jQuery的大量JavaScript代碼,以減少Memeory的佔用空間並確保它在iOS環境中有效地工作。我發現在這種情況下調試的最佳方式是在谷歌瀏覽器中使用profiler。剛剛回答了一個類似的問題,請參閱這裏瞭解更多信息:Is there any possible danger of using "JQuery.on()" profusely

當使用chrome分析器時,拍攝堆快照,進行更改,然後拍攝另一個堆快照並進行比較。通過這種方式可以看到腳本更改對memeory的影響。