私は大規模な単一ページアプリケーションを構築しており、最近JSのメモリリークを調べています。そして、私はChromeでプロファイル(スナップショット)機能を使用しているので、私は分離されたDOM要素がたくさんあることから、メモリリークが発生していると思います。ユーザーがボタンAをクリックした場合シングルページアプリケーションでイベントリスナーをアンバインドして子要素を削除する適切な方法は何ですか?
は<div id="container">
<div class="buttons">
<a class=".btn" href="/someurl/"> Button A</a>
<a class=".btn" href="/someurl/"> Button B</a>
<a class=".btn" href="/someurl/"> Button C</a>
</div>
<div class="ajaxHolder"></div>
</div>
ので、例えば、私は.ajaxHolder
にコンテンツをロードするためにAJAX呼び出しを使用します。ここでは
//This is the content...
<div class="contentA">
<p>some text...</p>
<input type="checkbox" class="checkbox">
<input type="checkbox" class="checkbox">
<input type="checkbox" class="checkbox">
<input type="checkbox" class="checkbox">
</div>
私はまた私のMAINスクリプトファイル内の2つの機能を持ちます。 1つはこれのようになります:
//Click event bound to a.btn which tigger the ajax call
$(.buttons).on('click', '.btn', function(){
//Do ajax here...
//on success...
var holder = $(".ajaxHolder");
holder.children().off().remove(); // Is this the way to do this??
holder.off().empty(); //I don't think I need .off() here, but I guess it can't hurt...
holder.append(ajaxSuccessData);
});
これまでのところとても良いです。しかし、今ロードされたコンテンツに、私も自分のMAINスクリプトファイル内でこの機能をしている:ユーザーがボタンBを押すと
//So here, I am binding an event to the checkboxes...
$(".ajaxHolder").on('change', '.checkbox', function(){
//Do something...
});
はだから今、例えば、.ajaxHolder
が空にされていますが、すべてのこれらのイベントは、私に結び付けチェックボックスは、分離されたDOMツリーに表示されているので、まわりをついているようです。
私はここで何が欠けていますか?このように実行される単一のページアプリケーションで、分離されたDOM要素がないことを確認するにはどうすればよいですか?
ボーナス質問:私はイベントの多くは、このように結ばれてい:私は.ajaxHolder
はいつもするので、イベントの委任を使用する必要があるため
$(".ajaxHolder").on('someEvent...','.someClass....', someFunction());
言うことです、すべてがいつも、私の.ajaxHolder
に取り付けられています。存在しているのですが、ロードされている他のアイテムは必ずしも存在しないので、私は単に$(button).on('click')...
などを実行することはできません。
これも正しい方法ですか?この.ajaxHolder
に添付できるアイテムの数に制限がありますか、これを行う際に問題はありませんか?
EDIT:これは私のコンソールのイメージです。
jQueryメソッドで要素を削除すると、データがjQueryを使用して関連付けられている限り、関連するすべてのデータを削除することができます。手動でイベントをバインド解除する必要はありません。 –
あなたはajaxHolder上で委譲することができますが、プロジェクトが成長するにつれて簡単に手を出すことができます。また、同じタイプのイベントハンドラが多数バインドされている場合は、パフォーマンスの低下を開始する可能性がありますが、そのパフォーマンスの問題が発生する前に、保守性の問題が発生する可能性があります。 –
@KevinBだから、なぜ分離されたDOM要素が現れていますか?削除されたアイテムへの参照を保持するその他の原因そして、2番目の部分については、それをajaxHolderに委譲する以外に、私は他にどのようなオプションがあるのでしょうか...ドキュメントに委譲できると思いますが、それは単なる旅行であり、問題を解決しません。あなたの解決策は何ですか? – Amir