jQuery点击事件可以解除绑定还是重置?

时间:2012-09-27 16:27:00

标签: javascript jquery html5 memory-leaks

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

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

我将点击事件绑定到文本框,如下所示:

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场,断点被击中三次。如果我在之后点击A ,则断点被击中四次。根据需要进行推断。)

我的代码中没有任何地方可以处理给定字段的现有点击事件。我怀疑我的泄漏是因为事件没有得到清理。话虽这么说,我对JavaScript / jQuery也不是很熟悉。从控件中删除点击事件有哪些技巧?

3 个答案:

答案 0 :(得分:5)

不确定。解开他们:

$field.unbind('click');

但是,请记住,这将删除所有事件处理程序以进行点击,而不仅仅是你的。为安全起见,您应该在绑定处理程序时使用名称空间:

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

然后,

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

那么,只会删除你的处理程序。

答案 1 :(得分:3)

如果您使用 .bind()绑定它们 .unbind()会删除事件

如果您使用 .on()来绑定它们 .off()会删除事件

答案 2 :(得分:1)

JQuery提供unbind函数来取消绑定事件侦听器。

请注意,您也可以使用removeEventListener在vanilla JS中执行此操作。

但是,您可能不应该每次都绑定GotoPageButtonAction而不是取消绑定:一次就足够了。