0

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

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

1 回答 1

1

有道理,您是否尝试过检查after函数返回的页面的来源?没有更多的 body 标签了 - 你的事件监听器(或者可能仍然在内存中,无用地晃来晃去)。
尝试将其附加到window.

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

现在在以前非常流行的浏览器的旧版本中,这(将事件侦听器附加到窗口对象)会导致内存泄漏。如果您需要, window 对象永远不会在此处真正销毁更多信息。

如何解决内存问题?

(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

于 2012-08-10T14:52:04.537 回答