微軟模型事件捕獲可能的內存問題

 JavaScript開發人員被鼓勵使用新的、基於規範的事件模型,即DOM LEVEL 2的事件模型。但是這種模型又分爲W3C和微軟兩種模型。

老事件模型和新的DOM LEVEL 2事件模型之間,最主要的區別在於:

新事件模型並不依賴於特定的事件來處理屬性;

你可以對任何一個對象的任何一種事件註冊多個事件句柄函數。

用來代替事件句柄屬性的是每個對象提供的3個方法:addEventListener、removeEventListener、dispatchEvent。

微軟的是:attachEvent和detachEvent

對於微軟模型,一個要考慮的因素是它會爲每個事件句柄留出響應的內存,即使你刷新頁面,也會爲每次連續的頁面載入留出相應的內容,這樣一會兒就會消耗大量的內存。爲了避免使用過多的內存,你需要跟蹤window的unload事件,然後調用detachEvent方法來清理每個事件。這將使內存管理系統在頁面卸載時釋放相應的內存空間。

例:

  1. function clickMe(evnt){ 
  2.     ... 
  3.  
  4. window.onload = setup; 
  5. window.onunload = cleanup; 
  6. function setup(evnt){ 
  7.     var evtObject = document.getElementById('clickme'); 
  8.  
  9.     //檢查對象模型 
  10.     if(evtObject.addEventListener){ 
  11.         document.addEventLietener("click",clickMe,false); 
  12.     }else if(evtObject.attachEvent){ 
  13.         evtObject.attachEvent("onclick",cliceMe); 
  14.     }else if(evtObject){ 
  15.         evtObject.onclick = clickMe; 
  16.     } 
  17.  
  18. //清理 
  19. function cleanup(){ 
  20.     var evtObject = document.getElementById("clickme"); 
  21.     if(evtObject.detachEvent){ 
  22.         evtObject.detachEvent("onclick",clickMe); 
  23.     } 

上例中,爲window.onunload事件句柄指定了一個名爲celanup的函數,就是用來完成這一工作。不過window的onunload事件中addEventListener方法使用的內存是無須清理的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章