0

onresize リスナーを body タグに問題なくアタッチしましたが、コードを変更して にアクセスするwindow.innerWidthwindow.innerHeight、サイズ変更イベントが 1 回しか機能しません。

<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+'%');
};

以前は非常に人気があったブラウザの古いバージョンでは、これ (ウィンドウ オブジェクトにイベント リスナをアタッチすること) がメモリ リークを引き起こします。ウィンドウ オブジェクトが実際に破棄されることはありません。詳細については、必要に応じてこちらを参照してください

メモリの問題を解決するには?

(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

于 2012-08-10T14:52:04.537 に答える