2012-07-20 79 views
0

我已將onresize偵聽器附加到body標籤,但是當我更改我的代碼以訪問window.innerWidthwindow.innerHeight時,我的resize事件只能使用一次。訪問窗口時,onresize事件不會觸發寬度

<script type="text/javascript"> 
    function showMsg() 
    { 
     document.write((window.innerWidth/window.innerHeight) * 100 + "%"); 
    } 
</script> 
<body onresize="showMsg()"> 

回答

1

有道理,你嘗試檢查你的頁面after功能的源已恢復?有沒有更多的身體標記 - 它是你的事件監聽器(或仍然可以在內存中,無用地搖晃)。
嘗試將其附加到window

window.onresize = function() 
{ 
    document.write((this.innerWidth/this.innerHeight)*100+'%'); 
}; 

現在在以前非常流行的瀏覽器的舊版本(將事件監聽器附加到窗口對象)導致內存泄漏。窗口對象從未真正銷燬more info here if you need it

如何解決mem問題?

(function(win) 
{ 
    win.onresize = function() 
    { 
     document.write((this.innerWidth/this.innerHeight)*100+'%'); 
    }; 
    if (win.attachEvent) 
    { 
     win.attachEvent('onbeforeunload',(function(self) 
     { 
      return function freeMem() 
      { 
       self.onresize = null; 
       self.detachEvent('onbeforeunload',freeMem); 
      }; 
     })(win)); 
     return; 
    } 
    win.addEventListener('beforeunload',(functio(self) 
    { 
     return function freeMem() 
     { 
      self.onresize = null; 
      self.removeEventListener('beforeUnload',freeMem,false); 
     }; 
    })(win),false); 
})(this);//this points to current window 

我知道,看起來可怕,但我測試過這一點,它做的伎倆 - 感謝您的IE瀏覽器。嚴格來說,通過winself的關閉可以省略,但我保留在那裏以確保一旦onbeforeunload事件觸發,並且處理程序返回所有函數和引用都不在範圍之內,所以GC的有沒有理由不是釋放內存。
在大多數情況下它是過度殺傷性的,但是如果有人在意,我決定在這裏發佈它:-P