2012-10-10 5 views
5

私は最近this tutorialを読んで、ある特定のjQueryリークが$.cache変数で追跡可能であることを読みました。サイズが大きすぎると、何か問題が起きていることを常に確認してください。

どれくらい大きいですか?どのくらいの量のメモリを食べているかを調べるための変数を調べる方法はありますか?

ホームページを読み込むだけで210個のオブジェクトをキャッシュするWebサイトで作業しています。それはあまりにも大きいですか?この問題についての徹底的な説明をお寄せいただければ幸いです。

+0

それは、それがどのように大規模ではないのですが、それは時間をかけて成長しますか。キャッシュが制限されていない(つまり、永遠に増加する)場合、メモリリークが発生している可能性があります。 –

+1

jQueryは真にブラウザ互換です。すべてのブラウザに要素を適切に処理するというIEの問題を引き起こします。 –

+0

あなたが合理的であれば、現代の記憶能力に負担をかけるのは難しいでしょう。もちろん、十分な大きさのメモリリークを作成しない限り。メモリの魔法の量はありません、それはすべてユーザーのハードウェアに依存します。 90年代のコンピュータを使っている人は気になりますか? –

答えて

3

$.cache額面のサイズはメモリリークについては何も教えていません。それは非常に小さく、まだメモリリークがあるか、または非常に大きく、メモリリークがない可能性があります。

ページでjQueryにバインドされているイベントリスナーが10人あり、さらに多くのエントリがある場合は、$.cacheにリークしていることがわかります。

大きなメモリセーバーは、個々の要素にイベントリスナーをアタッチするのではなく、イベントデリゲーションを使用することです。

セイ:

<ul> 
    <li></li> 
    <li></li> 
    <li></li> 
</ul> 

$("li").on("click", fn)(あなたがより多くの李さんはもちろんを持っている場合は、より多くの)$("ul").on("click", "li", fn)は関係なく、あなたが持っていると、まだ持っているどのように多くの李要素の一つだけを添付してしまうのに対し、3つの個々のイベントハンドラを添付します同じ結果。漏れの


例:

$("button").click(function() { 
    $("#target")[0].innerHTML = ""; 
    $("<div>").appendTo($("#target")).click($.noop); 
    $("#log").text(Object.keys($.cache).length); 
});​ 

http://jsfiddle.net/SGZW4/1/

理由.innerHTMLは、それがクリーンアップできないようにjQueryの一部がされていない、使用されていることです。

修正は同じのためのjQueryのメソッドを使用することです:

$("button").click(function() { 
    $("#target").html(""); 
    $("<div>").appendTo($("#target")).click($.noop); 
    $("#log").text(Object.keys($.cache).length); 
});​ 

http://jsfiddle.net/SGZW4/2/

+0

これは良いヒントです。私のメモリ使用量をよりよく調べるために$ .cache変数を使用するにはどうすればよいですか?私が考えた一例:キャッシュされた要素の数を確認し、ボタンをクリックして予期した視覚的な振る舞いをし、再度キャッシュされた要素の数を確認し、前のアクションを「リセット」するボタンをクリックし、要素番号はこのテストの開始時と同じです。これは、例えば、メモリ使用量をテストするために$ .cacheをうまく使っているのでしょうか? – ChuckE

+0

@ChuckE $ .cacheについて心配することはありません。すべてを避ける方法の1つは、最初に削除されない静的要素に対してイベント委任を排他的に使用することです。それ以外の場合は、標準のDOMメソッドではなく、常にjQueryメソッドを使用していることを確認してください。http://jsfiddle.net/SGZW4/1/ vs http://jsfiddle.net/SGZW4/2/ – Esailija

+0

humm、interesting。だから、つまり、テストされたケースでは、$ .cacheはメモリリークがあったかどうかもチェックできません。 – ChuckE

関連する問題