Javascript jQuery单击事件是否可以解除绑定或重置?
我在正在处理的网页上发现了一个资源泄漏 此网页有两个文本字段,单击“显示模式对话框”后,向后端执行数据请求,然后将该信息显示在表格中,用户可以从中选择条目,以便在最初单击的文本框中使用 我将单击事件绑定到文本框,如下所示:Javascript jQuery单击事件是否可以解除绑定或重置?,javascript,jquery,html,memory-leaks,Javascript,Jquery,Html,Memory Leaks,我在正在处理的网页上发现了一个资源泄漏 此网页有两个文本字段,单击“显示模式对话框”后,向后端执行数据请求,然后将该信息显示在表格中,用户可以从中选择条目,以便在最初单击的文本框中使用 我将单击事件绑定到文本框,如下所示: var $field = $('#one-of-the-text-fields'); $field.click(function () { App.DialogClass.show(); App.DialogClass.PopulateTab
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。从控件中删除单击事件的一些技术是什么?jQuery提供了此功能取消绑定事件侦听器
注意,您也可以在vanilla JS中使用
但是,您可能不应该每次在
gotopagebuttonnaction
:一次就足够了,而不是解除绑定。只需解除绑定即可:
$field.unbind('click');
但是,请记住,这将删除click的所有事件处理程序,而不仅仅是您的事件处理程序。为安全起见,绑定处理程序时应使用名称空间:
$field.bind('click.mynamespace', function(){
// do something
});
那么
因此,只有您的处理程序将被删除。如果您使用.bind()绑定它们。unbind()将删除事件
如果您使用.on()绑定它们.off()删除事件.unbind()?在较新的jquery版本上如果使用jquery 1.7+,则应使用
on()
和off()
对于这一点,问题可能是您在一个运行多次的函数中绑定单击,反复绑定单击,因为这往往会导致这个确切的问题。由于我正在使用的分页系统的性质,我必须执行重新绑定,因为后端的请求取决于单击的字段。I通常不会在单击时执行重新绑定,但这种情况是一次性的。“从jQuery 3.0开始,已被弃用。自jQuery 1.7以来,它已被该方法取代,因此已不鼓励使用它。”
$field.unbind('click.mynamespace');