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

我在我正在研究的网页上发现了资源泄漏。

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

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

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

当然。 解开他们:

 $field.unbind('click'); 

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

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

然后,

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

那么,只有你的处理程序将被删除。

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

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

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

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

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