2

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

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

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

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 也不是很熟悉。从控件中删除点击事件有哪些技巧?

4

3 回答 3

5

当然。只需解开它们:

$field.unbind('click');

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

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

然后,

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

因此,只有您的处理程序将被删除。

于 2012-09-27T16:30:11.330 回答
4

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

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

于 2012-09-27T16:36:01.667 回答
1

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

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

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

于 2012-09-27T16:28:22.450 回答