我应该在jQuery中删除事件监听器吗?

时间:2015-06-28 16:36:01

标签: javascript jquery event-handling

我的网站适用于jQuery + AJAX,并且有唯一的javascript文件,当用户打开任何页面时会加载一次,所以我用来向所有元素添加事件监听器,例如:<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="5dip" > <TextView android:id="@+id/singleDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" android:textStyle="bold" /> </RelativeLayout> 。< / p>

有一段时间我注意到代码中有$(document).on(...)个太多,我很害怕。当用户点击链接/返回按钮时,我每次服用9粒药物并强制它删除无用的听众。

.on(...)

那有什么意义吗?也许有很多听众做了一些我不知道的坏事?

1 个答案:

答案 0 :(得分:0)

当你将一个监听器附加到一个事件时,它确实需要内存,它可以(如果完全取消选中)导致与内存相关的问题。根据我的经验,最好在对象中使用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