1. 程式人生 > 實用技巧 >IE下比較常見的記憶體洩露問題——document.getElementById

IE下比較常見的記憶體洩露問題——document.getElementById

由於IE的JScript和DOM物件使用不同的垃圾收集方式,因此閉包在IE中會導致一些問題,就是記憶體洩漏的問題,也就是無法銷燬駐留在記憶體中的元素。

當頁面中元素被移除或替換時,若元素繫結的事件仍沒被移除,在IE中不會作出恰當處理,此時要先手工移除事件,不然會存在記憶體洩露。

例如:以下程式碼會存在記憶體洩露:

下面“btn.onclick”事件,沒有被移除,一直存在記憶體中,沒有被銷燬

<div id="myDiv">
    <input type="button" value="Click me" id="myBtn">
</div>
<script 
type="text/javascript"> var btn = document.getElementById("myBtn"); btn.onclick = function(){ document.getElementById("myDiv").innerHTML = "Processing..."; } </script>

應該改成以下寫法:

<div id="myDiv">
    <input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript"> var btn = document.getElementById("myBtn"); btn.onclick = function(){ btn.onclick = null; document.getElementById("myDiv").innerHTML = "Processing..."; } </script>

或者採用事件委託(個人認為“document.onclick”,在字面意思上,沒有上面“onclick ”的效率高。)

<
div id="myDiv"> <input type="button" value="Click me" id="myBtn"> </div> <script type="text/javascript"> document.onclick = function(event){ event = event || window.event; if(event.target.id == "myBtn"){ document.getElementById("myDiv").innerHTML = "Processing..."; } } </script>

demo測試

多個重複的點選事件,只是為了看看能否更明顯看到記憶體變化

值得疑惑的是:

在進行記憶體洩漏測試過程中,我一開始使用的 IE11 (window.navigator.platform="Win32") 瀏覽器下,檢查不出記憶體洩露。

我換了一個裝置的IE11(window.navigator.platform="Win64"),就可以看到記憶體漲了。

不知道這個IE的記憶體回收機制,是否和IE的版本有關。

以下是64位下的IE11測試資料,可以看到10多分鐘過去,記憶體漲了30MB

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4 <title>記憶體洩漏測試</title>
 5 </head>
 6 <body>
 7     <div id="myDiv">
 8         <input type="button" value="Click me" id="myBtn">
 9     </div>
10     <div id="myDiv2">
11         <input type="button" value="Click me" id="myBtn2">
12     </div>
13     
14     <div id="myDiv3">
15         <input type="button" value="Click me" id="myBtn3">
16     </div>
17     <div id="myDiv4">
18         <input type="button" value="Click me" id="myBtn4">
19     </div>
20     
21 </body>
22 <script>
23   var btn = document.getElementById("myBtn");
24   btn.onclick = function(){    
25     document.getElementById("myDiv").innerHTML = "Processing...";
26   }
27   
28   var btn2 = document.getElementById("myBtn2");
29   btn2.onclick = function(){    
30     document.getElementById("myDiv2").innerHTML = "Processing...2";
31   }
32   
33   var btn3 = document.getElementById("myBtn3");
34   btn3.onclick = function(){    
35     document.getElementById("myDiv3").innerHTML = "Processing...3";
36   }
37   
38   var btn4 = document.getElementById("myBtn4");
39   btn4.onclick = function(){    
40     document.getElementById("myDiv4").innerHTML = "Processing...4";
41   }
42 </script>
43 </html>