2012-09-27 53 views
1

我在我正在处理的网页上发现资源泄漏。jQuery点击事件可以解除绑定或重置吗?

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

我绑定click事件的文本框,如下所示:

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也不是非常熟悉。什么是从控件中删除点击事件的一些技巧?

+1

http://api.jquery.com/unbind/ –

+1

.unbind()? http://api.jquery.com/unbind/ – supernova

+0

[off()](http://api.jquery.com/off/)在更新的jquery版本 – fcalderan

回答

5

当然。只要他们解除绑定:

$field.unbind('click'); 

但是,请记住,这将删除所有事件处理程序点击,不只是你的。为了安全起见,应结合处理程序时使用的命名空间:

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

然后,

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

这样,那么,只有您的处理程序将被删除。

1

JQuery提供unbind函数来解除绑定事件侦听器。

请注意,你也可以在香草JS使用removeEventListener来做。

但不是解除绑定,你可能不应该绑定每一个GotoPageButtonAction:一次就够了。

+0

由于我正在处理的分页系统的性质,我必须执行重新绑定,因为后端中的请求取决于单击的字段。点击通常我不会执行重新绑定,但这种情况是一次性的。 –

3

如果你已经使用.bind()约束他们.unbind()删除事件

如果你已经使用。对()约束他们.off()移除了事件