And*_*ray 1 javascript jquery html5 memory-leaks
我在我正在处理的网页上发现了资源泄漏.
此网页有两个文本字段,在单击时显示模式对话框,对后端执行数据请求,然后在表中显示该信息,用户可以从中选择一个条目,以便在最初单击的文本框中使用.
我将点击事件绑定到文本框,如下所示:
var $field = $('#one-of-the-text-fields');
$field.click(function () {
App.DialogClass.show();
App.DialogClass.PopulateTable();
App.DialogClass.GotoPageButtonAction(actionArgs); // Offender!
});
Run Code Online (Sandbox Code Playgroud)
...哪个电话......
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);
Run Code Online (Sandbox Code Playgroud)
我注意到泄漏,因为当我使用Chrome的JavaScript调试器时,每次点击不同的按钮时,我总是会有一个额外的断点(例如,我第一次点击字段A时,断点被击中两次.当我击中字段时此后B,断点被击中三次.如果我点击后认为,断点命中四次.必要时外推.)
我的代码中没有任何地方可以处理给定字段的现有点击事件.我怀疑我的泄漏是因为事件没有得到清理.话虽这么说,我对JavaScript/jQuery也不是很熟悉.从控件中删除单击事件有哪些技巧?
当然.解开他们:
$field.unbind('click');
Run Code Online (Sandbox Code Playgroud)
但是,请记住,这将删除所有事件处理程序以进行单击,而不仅仅是您的.为安全起见,您应该在绑定处理程序时使用名称空间:
$field.bind('click.mynamespace', function(){
// do something
});
Run Code Online (Sandbox Code Playgroud)
然后,
$field.unbind('click.mynamespace');
Run Code Online (Sandbox Code Playgroud)
那么,只有你的处理程序将被删除.
归档时间: |
|
查看次数: |
5501 次 |
最近记录: |