2010-03-09 20 views
3

我有一個奇怪的行爲。我正在使用一個相當沉重的頁面(4000個節點),意在顯示一個派送系統的交付操作。每30秒。我用jquery刷新操作列表(3000個節點超過4000個)。它工作得很好,但是...每次,firefox和chrome的內存都增加3到6ko。當然,過了一段時間,瀏覽器崩潰了......瀏覽器內存不斷增加與JavaScript阿賈克斯調用

有沒有人有任何想法爲什麼?這是內存泄漏嗎? JavaScript是否失敗了?我檢查過了,每次刷新後,我有相同數量的節點,這意味着替換正常執行。

每次刷新操作後我重置幾個事件:這裏有一個例子

$("#orders_list .list_table_row").hover(
      function(){ 
      // mouse over 
       $(this).children().css("background-color","#E0E0E0"); 
      }, 
      function(){ 
      // mouse out 
       $(this).children().css("background-color",""); 
      }); 

任何建議真的歡迎,提示什麼...

我發現2個相關鏈接: http://www.javascriptkit.com/javatutors/closuresleak/index3.shtmlhttp://www.jibbering.com/faq/faq_notes/closures.html

感謝, 保羅

修訂1 - 添加代碼示例和鏈接

+0

代碼(甚至縮小)將受到歡迎...;) – Bobby 2010-03-09 18:51:08

+1

一些更多的信息將是很好的。例如,你正在替換的4000個節點中是否有附加的事件處理程序,是否使用閉包等。所有這些都可能是內存泄漏的原因。 – 2010-03-09 18:54:19

+1

FF有一個內存泄漏監視器插件,我沒有嘗試過太多(只是安裝它)。也許它可以給你一個提示? https://addons.mozilla.org/en-US/firefox/addon/2490 – MyGGaN 2010-03-09 18:58:21

回答

4

您的問題可能是事件處理程序。每次刷新管理所有這些節點的綁定和解除綁定可能過於複雜。

請嘗試使用事件委託。 jQuery的.live()方法就是你想要的。它將使刷新更快並消除事件處理程序的複雜性和泄漏。代替$(".myclass").click(/*...*/)使用$(".myclass").live("click", /*...*/)。您只需在頁面加載時執行一次,即使在您的ajax刷新之後,它也可以用於該類的所有未來元素。

查看文檔:http://api.jquery.com/live/

+0

謝謝bcherry!很有意思。我將探索這個功能。其實我在替換節點之前使用了$(「。myclass」)。unbind(/*...*/),它解決了我的問題。 – Paul 2010-03-09 21:51:08

2

您可以刪除這些事件綁定到節點之前的事件處理程序解除綁定(最好銷燬)。不這樣做會泄漏內存。
IE在使用閉包時也存在內存泄漏問題,如果閉包在某個點處被孤立並且沒有被正確銷燬,在某些情況下,垃圾收集器將無法拾取它。 有可用來跟蹤內存泄漏(火狐一個在評論上述),IE Leak Detector一些工具,JavaScript Memory Leak Detector
關於瀏覽器(主要是IE)內存泄漏的一些詳細信息:
Understanding and Solving Internet Explorer Leak Patterns
Closures Leaks in IE

+0

謝謝伊利亞!我認爲這些事件是關閉問題的問題。我在替換之前解除了所有事件並解決了問題。謝謝你的幫助!乾杯! – Paul 2010-03-09 21:50:35