$.cache
の額面上のサイズは、メモリ リークについては何もわかりません。非常に小さくてもメモリ リークが発生する場合もあれば、非常に大きくてもメモリ リークが発生しない場合もあります。
ページ上で一度に 10 個のイベント リスナーが jQuery にバインドされてい$.cache
て、それ以上のエントリがあることがわかっている場合は、リークしていることがわかります。
メモリを大幅に節約するには、個々の要素にイベント リスナーをアタッチするのではなく、イベント委任を使用します。
言う:
<ul>
<li></li>
<li></li>
<li></li>
</ul>
$("li").on( "click", fn )
3 つの個別のイベント ハンドラーをアタッチします (もちろん、より多くの li がある場合はさらに)。一方、$("ul").on( "click", "li", fn)
li 要素の数に関係なく 1 つだけをアタッチし、同じ結果を得ます。
漏れの例:
$("button").click( function() {
$("#target")[0].innerHTML = "";
$("<div>").appendTo( $("#target")).click( $.noop );
$("#log").text( Object.keys( $.cache ).length );
});
http://jsfiddle.net/SGZW4/1/
理由は、jQuery の一部ではない .innerHTML が使用されているため、クリーンアップを実行できないためです。
修正は、同じためにjQueryメソッドを使用することです:
$("button").click( function() {
$("#target").html("");
$("<div>").appendTo( $("#target")).click( $.noop );
$("#log").text( Object.keys( $.cache ).length );
});
http://jsfiddle.net/SGZW4/2/