javascript - 事件和 DOM 元素

标签 javascript jquery jquery-events

假设我有一个包含两列布局的页面,其中左列是一组链接,单击该链接时它会在右列中加载关联的 html 页面/模板。

加载模板后,有一个模板处理程序通过 requirejs 初始化为单例,它定义了一些方法和处理程序,例如:

SomePage.prototype.saveHandler: function(e) { ... }; // Page handler has a handler

SomePage.prototype.initialize: function() {
    $('#btnSave').on('click', saveHandler);
}

然后,我在每次加载页面时通过初始化方法附加 DOM 事件。

SomePage.initialize(); // This attaches the click event

现在,当我单击左侧的另一个链接时,会加载一个不同的模板页面,并为该页面重复上述过程。

我想知道之前附加到 btnSave 元素的点击事件发生了什么?它现在是 jQuery 缓存中的悬空事件处理程序吗?

如果我在同一页面再次加载时尝试删除它,它是否真的会删除原始事件?

$('#btnSave').off('click', saveHandler);

执行以下 block 是否可以防止内存泄漏/悬挂引用?

// The potential problem here is that btnSave is part of the newly loaded template 
// and not the element i attached the handler to earlier (which doesn't exist anymore)
$('#btnSave').off('click', saveHandler);

$('#btnSave').on('click', saveHandler); 

确保我不会遇到悬空引用和内存泄漏的最佳方法是什么。这也是纯 JavaScript 的一个潜在问题。我的理解是,刷新模板页面时,上述内容将不起作用。与此同时,我将对其进行试验,但很高兴知道专家们是如何处理这个问题的。

最佳答案

看看这张来自 javascript 大师 Andy Osmani 的幻灯片。你会在这里找到关于内存泄漏和循环引用的答案: https://speakerdeck.com/addyosmani/javascript-memory-management-masterclass

关于javascript - 事件和 DOM 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25611540/

相关文章:

javascript - 如何使用 JavaScript 更改表格的单个单元格

javascript - 如何在 JavaScript 中使用 querySelector 选择具有特定类的所有子元素,而不考虑它们在 HTML 中出现的顺序?

javascript - Javascript中的 "button is null"是什么意思?

javascript - 花式框单击不打开,需要双击

jQuery 1.4.2 - 是 $ ("#foo").hide ("normal") 坏了还是我疯了?

javascript - 用户在文本框中按下回车的 JQuery 事件?

javascript - 实现自动完成时出现 "this.source is not a function"错误

javascript - CSS跨浏览器改变布局

javascript - 如何在需要转换为 JS Obj 的 JSON 字符串中传递 "this"

javascript - jQuery 中最接近的函数并提取元素