访问窗口宽度时,onresize事件未触发

时间:2012-07-20 16:45:33

标签: javascript onresize

我已将onresize侦听器附加到body标签上,但是当我更改代码以访问window.innerWidthwindow.innerHeight时,我的resize事件只能运行一次。

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

1 个答案:

答案 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