我已将onresize侦听器附加到body标签上,但是当我更改代码以访问window.innerWidth
和window.innerHeight
时,我的resize事件只能运行一次。
<script type="text/javascript">
function showMsg()
{
document.write((window.innerWidth / window.innerHeight) * 100 + "%");
}
</script>
<body onresize="showMsg()">
答案 0 :(得分: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。严格地说,可以省略将win
传递给self
的闭包,但是只要onbeforeunload
事件触发,并且处理程序返回,我就会将其保留在那里以确保无误所有函数和引用都超出了范围,因此GC没有理由不来释放内存。在大多数情况下,它有点矫枉过正,但万一有人关心,我决定在这里张贴...... :-P