Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery单击事件是否可以解除绑定或重置?_Javascript_Jquery_Html_Memory Leaks - Fatal编程技术网

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');