シングルページのウェブアプリを構築しています。これは、一定期間にわたって新しい DOM 要素を取得し、不要なものを削除することを意味します。たとえば、新しいフォームをフェッチするときは、特定の div のコンテンツをそのフォームの HTML に置き換え、このフォームの要素に固有のリスナーも設定します。しばらくしてから、このフォームの内容をフォームの新しいインスタンス (ID が異なる) に置き換えます。
この新しいフォームのイベント リスナーを再度セットアップします。以前のフォームはもはや DOM の一部ではないので、DOM 要素は自動的にガベージ コレクションされるはずです。また、DOM から削除された要素を指すリスナー関数が消えることも期待しています。
ただし、Chrome から収集した次のプロファイルは、リスナー数が時間の経過とともに増加していることを示しています。なぜそうなのか教えていただけますか?「ごみを集める」ボタンをクリックしてみました。しかし、これは私が得るプロファイルです。アプリケーションの作成方法に何か問題がありますか? 問題はありますか? もしそうなら、どのように修正すればよいですか?
問題がある場合は、jquery、jquery-ui、およびその他のプラグインで JSP テンプレート言語を使用しています。これは、ページで追加/削除する動的フラグメントがどのように見えるかです。
<script>
$(document).ready(function() {
$("#unique_id").find(".myFormButton").button().click(
function() {
$.ajax({url: "myurl.html",
success: function(response) {
console.log(response);
}
});
});
});
</script>
<div id="unique_id">
<form>
<input name="myvar" />
<button class="myFormButton">Submit</button>
</form>
</div>
アップデート
実際のコードを見たい場合は、ここに関連する部分があります。 このリンクは、クリア ボタンが押されると関数 clearFindForm が呼び出され、Ajax リクエストを使用してコンテンツ (HTML フラグメント) を効果的に再フェッチし、この jsp の div 全体をフェッチしたコンテンツに置き換えることを示しています。refetchContent 関数は次のように機能します。 より良い回答を得るのに役立つ場合に備えて、コードへのリンクを次に示します。
function refetchContent(url, replaceTarget) {
$.ajax({
url: url,
data: {},
type: "GET",
success: function (response) {
replaceTarget.replaceWith(response);
},
error: function (response) {
showErrorMessage("Something went wrong. Please try again.");
}
});
}