2011-02-14 73 views
7

我試圖擺脫瀏覽器中令人討厭的內存泄漏。使用javascript動態刷新圖像時發生內存泄露

這就是我想要做的:
- 我定期嘗試使用javascript刷新HTML頁面中的圖像。
- 所有代碼應該與Internet Explorer 6或更高版本以及Firefox兼容。

你可以在下面找到我的代碼。

這就是我觀察到的: 每次我輪詢新圖像時,瀏覽器似乎都會將前一張圖像保存在緩存中。因此,Chrome9/Internet Explorer 6/Safari 5的內存使用量在時間上保持線性增長。只有firefox(3.6)在向圖像添加no-cache標頭時似乎表現正常。我已經設置了很高的刷新率(10毫秒),以便快速查看內存的增長情況。

我已經嘗試過:
-Adding標頭禁用緩存圖像:僅適用於Firefox的
這是響應頭:

HTTP/1.1 200 OK 日期:星期一,14 Feb 2011 11:17:02 GMT 服務器:Apache/2.2.9(Debian)PHP/5.2.6-1 + lenny9與Suhosin -Patch mod_python/3.3.1 Python/2.5.2 X-Powered-by-P​​HP /5.2.6-1+lenny9 Pragma:no-cache Cache-control:no-cache,no-store,must-revalidate,max-age = 1,max-stale = 0,post-check = 0,pre -check = 0,最大值-age = 0 Expires:Mon,14 Feb 2011 11:17:02 GMT Content-Length:358 Keep-Alive:timeout = 15,max = 100 Connection:Keep-Alive Content-Type:image/png

通過POST方法-Requesting以base64字符串格式的圖像(POST請求默認情況下不被緩存):沒有什麼區別
-Trying各種事物般的環境變量設置爲null,並調用clearInterval或類似的方法。
- 每次請求時更改/不更改圖像名稱。
- 在iFrame中下載代碼並每隔5秒刷新一次iFrame似乎會清除除IE6以外的所有瀏覽器的內存,所以這不是一個解決方案。
- 似乎沒有工作的其他事情。

我希望你們任何一個聰明的傢伙都能幫助我。我十分絕望=)

<html> 
<head> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache, no-store, must-revalidate, max-age=-1, max-stale=0, post-check=0, pre-check=0"> 
    <meta http-equiv="expires" content="-1"> 
    <style type="text/css"> 
     body { 
      padding: 0px; 
      margin: 0px; 
      background-color: #B0B9C0; 
     } 

     img { 
      width: 167px; 
      height: 125px; 
      background-color: #B0B9C0; 
      border: none; 
     } 
    </style> 
    <script type="text/javascript"> 
     var previewUrl  = "http://nick-desktop/image/"; 
     var previewImage = document.createElement("img"); 
     var previewTimeout = 10; 
     var previewWidth = 200; 
     var previewHeight = 80; 
     var timerID = 0; 

     function initialize() { 
      if(previewTimeout==null || previewUrl == null || previewWidth==null || previewHeight==null) return; 
      document.body.appendChild(previewImage); 
      previewImage.src = previewUrl; 
      previewImage.style.width = previewWidth+"px"; 
      previewImage.style.height = previewHeight+"px"; 
      timerID = setInterval(doPoll, previewTimeout); 
     } 

     function doPoll() { 
      previewImage.src = previewUrl + new Date().getTime()+".png"; 
     } 
    </script> 
</head> 
<body onload="initialize()"> 
</body> 

+0

您是否嘗試過更新它之前從DOM中刪除舊的形象呢? parent.removeChild(elemToRemove) – chriszero 2011-02-14 14:16:17

回答

1

試試這個:

<html> 
<head> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache, no-store, must-revalidate, max-age=-1, max-stale=0, post-check=0, pre-check=0"> 
    <meta http-equiv="expires" content="-1"> 
    <style type="text/css"> 
     body { 
      padding: 0px; 
      margin: 0px; 
      background-color: #B0B9C0; 
     } 

     img { 
      width: 167px; 
      height: 125px; 
      background-color: #B0B9C0; 
      border: none; 
     } 
    </style> 
    <script type="text/javascript"> 
     var previewUrl  = "http://nick-desktop/image/"; 
     var previewTimeout = 10; 
     var previewWidth = 200; 
     var previewHeight = 80; 
     var timeout; 

     window.onload = function() { 
      if(previewTimeout==null || previewUrl == null || previewWidth==null || previewHeight==null) return; 
      doPoll(); 
     } 

     function doPoll() { 
      clearTimeout(timeout); 
      document.body.innerHTML = ""; 
      var previewImage = null; 

      previewImage = document.createElement("img"); 
      previewImage.style.width = previewWidth+"px"; 
      previewImage.style.height = previewHeight+"px"; 
      previewImage.onload = function() { timeout = setTimeout(doPoll, previewTimeout); }; 
      document.body.appendChild(previewImage); 

      previewImage.src = previewUrl + "image.png?datetime=" + new Date().getTime(); 
     } 
    </script> 
</head> 
<body> 
</body> 
</html>