Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.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_Event Handling - Fatal编程技术网

Javascript 我应该删除jQuery中的事件侦听器吗?

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

我的站点在jQuery+AJAX上工作,并且只有一个javascript文件,当用户打开任何页面时会加载一次,因此我习惯于向所有元素添加事件侦听器,例如:
$(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);
});
是的,一次注册太多的侦听器可能会导致问题,但是您可以使用浏览器的开发工具等来监视内存使用情况。特别是,您可能会耗尽堆栈(和堆?)内存,并可能导致浏览器崩溃

处理这类问题也有一个很好的答案