我正在构建一个单页 webapp。这意味着在一段时间内我会获得新的 DOM 元素,删除不需要的元素。例如,当我获取一个新表单时,我只需用该表单 HTML 替换特定 div 的内容,并设置此表单元素独有的侦听器。一段时间后,我将这个表单的内容替换为一个新的表单实例(具有不同的 ID)。
我再次为这个新表单设置了事件监听器。现在以前的表单不再是 DOM 的一部分,所以我应该自动对 DOM 元素进行垃圾收集。我还期望指向从 DOM 中删除的元素的侦听器函数消失。
但是,从 Chrome 收集的以下配置文件表明,我的听众数量随着时间的推移而增加。你能告诉我为什么会这样吗?我尝试点击“收集垃圾”按钮。但这是我得到的个人资料。我构建应用程序的方式有问题吗?有问题吗?如果有,我应该如何解决?
万一这很重要,我将 JSP 模板语言与 jquery、jquery-ui 和其他一些插件一起使用。这就是我在页面上添加/删除的动态片段的样子。
<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.");
}
});
}