javascript - jQuery 点击事件可以解除绑定(bind)或重置吗?

标签 javascript jquery html memory-leaks

我在我正在处理的网页上发现资源泄漏。

此网页有两个文本字段,点击后会显示一个模式对话框,向后端执行数据请求,然后在表格中显示该信息,用户可以从中选择一个条目用于他们最初点击的文本框中。

我像这样将点击事件绑定(bind)到文本框:

var $field = $('#one-of-the-text-fields');

$field.click(function () {
        App.DialogClass.show();
        App.DialogClass.PopulateTable();
        App.DialogClass.GotoPageButtonAction(actionArgs);  // Offender!
});

...调用...

App.DialogClass = (function($) {

var pub {},
    $gotoPage = $('#pageNumberNavigationField'),
    $gotoPageButton = $('#pageNumberNavigationButton');

// ...SNIP unimportant other details...

pub.GotoPageButtonAction = function (args) {
    $gotoPageButton.click(function () {
        var pageNumber = $gotoPage.val();
        pub.PopulateTable(args);   // Breakpoint inserted here...
    });
};

return pub;

})(jQuery);

我注意到泄漏是因为当我使用 Chrome 的 JavaScript 调试器运行时,每次单击不同的按钮时我总是会遇到一个额外的断点(例如,我第一次单击字段 A 时,断点被命中两次。当之后我点击字段 B,断点被击中 3 次。如果我在 那个 之后单击 A,断点被击中四次。根据需要推断。)

在我的代码中,我没有对给定字段的现有点击事件做任何事情。我怀疑我的泄漏源于事件没有得到清理这一事实。也就是说,我对 JavaScript/jQuery 也不是很熟悉。从控件中删除点击事件有哪些技巧?

最佳答案

当然。解除绑定(bind):

$field.unbind('click');

但是,请记住,这将删除所有 的点击事件处理程序,而不仅仅是您的。为了安全起见,您应该在绑定(bind)处理程序时使用 namespace :

$field.bind('click.mynamespace', function(){
    // do something
});

然后,

$field.unbind('click.mynamespace');

那么,只有您的处理程序会被删除。

关于javascript - jQuery 点击事件可以解除绑定(bind)或重置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12625919/

相关文章:

javascript - 使用 Localstorage 将 javascript 变量从一个 html 页面存储和检索到另一个 (DOM)

javascript - 使用数据表时,取消选中所有复选框不适用于所有页面

javascript - ExpressJS 用于在 GET 请求上呈现内容

javascript - HTML 表格逐一显示 JQuery 复选框并且不保留数据

javascript - Coinbase.com API + Node.js 中的 secret HMAC 身份验证

javascript - webgl 试图画一个三 Angular 形

javascript - 在 knockout 中标记复选框和单选框

javascript - three.js中dat.gui.js和trackballControl.js冲突

javascript - JQuery 在 Firefox 和 Chrome 中无法正常工作

html - 背景 100% 高度,左侧