js 如何移除别人设置的未知的自定义的事件?

使用了别人的平台,发现平台对 body 自带了 touchmove 事件监听,
我该怎么获取对应的 事件函数 并移除?
在 chrome console 调用getEventListeners可以获取,但是代码中并不能~
求大佬指教~

阅读 4.4k
5 个回答

什么叫“使用了别人的平台”?

匿名事件句柄无法移除。

P.S. 比较 hack 一点的做法是重写 HTMLElement.prototype.addEventListener 方法,但这要求你覆写的代码要在绑定之前执行,而如果你是通过注入等方式的话并不能控制执行时序。

当然是覆盖定义它,一定要在别人声明之后定义,直接写
...on('touchmove', null)

看源码先看一下他的事件是怎么侦听上的。标准方式两种,ontouchmove = xxxaddEventListener('touchmove', xxx),更常使用后者。对于前者,重新赋值为 null 就好。对于后者,addEventListener 系列 API 是不会自己暴露 listener 的,也没有提供全部清除的功能,只能看这个函数是否另外以某种方式声明为了全局变量或某全局变量的某个属性然后找它,然后 removeEventListener

找不到就需要如其他回答所说,hack 一下 addEventListener,或重新生成对应 DOM。


当然上述一切都只是原生 JS API 上的通用方法。如果:

  1. 你使用的平台有相应 API,可以使之不侦听或使侦听函数简单跳出,那就用那个 API。
  2. 你使用的平台基于其他框架,那就找那个框架提供的相应 API,但你没说相关信息我也不知道是啥框架。比如 jQuery,对于 on 绑上的侦听器,提供了 off 可以在不提供相关侦听器时移除所有。
  3. 你使用的平台可以改源码,你也愿意改源码,那就改。

可以试试这样来阻止。

$('#XX').on('touchmove', function(e){
    e.preventDefault();
})

匿名没办法。可以考虑一些变态办法。

  1. 楼上说的覆盖 addEventListener。以及特定的 onxxx
  2. 事件是绑定在DOM上面的,那么你可以把DOM删了,然后重新生成。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题