Javascript 我应该删除jQuery中的事件侦听器吗?
我的站点在jQuery+AJAX上工作,并且只有一个javascript文件,当用户打开任何页面时会加载一次,因此我习惯于向所有元素添加事件侦听器,例如:Javascript 我应该删除jQuery中的事件侦听器吗?,javascript,jquery,event-handling,Javascript,Jquery,Event Handling,我的站点在jQuery+AJAX上工作,并且只有一个javascript文件,当用户打开任何页面时会加载一次,因此我习惯于向所有元素添加事件侦听器,例如:$(document).on(…) 过了一会儿,我注意到代码中有太多的.on(…),我很害怕。我吃了9片药,每次当用户点击链接/返回按钮时,我都强迫它删除无用的听众 function page_reload(){ if(c.r == 'http://example.com/page1'){ $(document).on('cl
$(document).on(…)
过了一会儿,我注意到代码中有太多的.on(…)
,我很害怕。我吃了9片药,每次当用户点击链接/返回按钮时,我都强迫它删除无用的听众
function page_reload(){
if(c.r == 'http://example.com/page1'){
$(document).on('click', '#send', func.send);
$(document).on({mouseenter: func.me, mouseleave: func.ml}, '#chan');
}else{
$(document).off('click', '#send');
$(document).off('*', '#chan');
}
}
那有什么意义吗?可能有很多侦听器做了一些我不知道的坏事?当您将侦听器附加到事件时,它会占用内存,并且可能(如果完全未选中)导致内存相关问题。根据我的经验,最好在对象中使用
cleanup
方法,当某个事件触发时,可以使用.off()
方法注销事件侦听器
这些类型的方法的特定逻辑将因项目而异,但形式如下:
var MyApp = {
cleanup: function cleanMyApp(event) {
this.off('#myId1', myMethod1);
this.off('#myId2', myMethod2);
}
}
$('document').on('ready', function() {
$(document).on('importantEvent', function(event) {
event.preventDefault(); // if you need to
MyApp.cleanup();
});
// or
$('#elem').on('something', MyApp.cleanup);
});
是的,一次注册太多的侦听器可能会导致问题,但是您可以使用浏览器的开发工具等来监视内存使用情况。特别是,您可能会耗尽堆栈(和堆?)内存,并可能导致浏览器崩溃
处理这类问题也有一个很好的答案