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

Should I remove event listeners in jQuery?

我的网站在 jQuery + AJAX 上运行并且有唯一的 javascript 文件,当用户打开任何页面时加载一次,所以我习惯于添加事件监听器所有元素如:$(document).on(...).

一段时间后,我发现代码中 .on(...) 太多了,我很害怕。我服用了 9 颗药丸,并在每次用户单击 link / 后退按钮时强制它删除无用的侦听器。

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

所以是的,一次注册过多的侦听器可能会导致问题,但您可以使用浏览器的开发工具等监控内存使用情况。特别是你可以 运行 堆栈(和堆?)内存不足并可能使浏览器崩溃。

关于处理这类问题,也有很好的答案here