JavaScript - 如何检查事件是否已添加

Shl*_*omo 21 javascript event-listener

我想要一次添加一个监听器beforeunload.这是我的伪代码:

if(window.hasEventListener('beforeunload') === false) {
     window.addEventListener('beforeunload', function() { ... }, false);
}
Run Code Online (Sandbox Code Playgroud)

hasEventListener显然不存在.我怎样才能做到这一点?谢谢.

小智 24

实际上,无需检查是否将侦听器添加到目标:

如果在具有相同参数的同一EventTarget上注册了多个相同的EventListener,则会丢弃重复的实例.它们不会导致EventListener被调用两次,并且由于丢弃了重复项,因此不需要使用removeEventListener方法手动删除它们.

资料来源:https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener#Multiple_identical_event_listeners

  • unfortunately it is not true. at least not for chrome. (24认同)
  • 确实如此,如果您实际使用完全相同的侦听器,而不仅仅是具有相同文本的侦听器:https://jsfiddle.net/myxqu27d/ (15认同)
  • @MikeLee 监听器函数必须引用之前添加的监听器,否则会执行两次以上 (2认同)
  • @MikeLee Lee 确实,在有多个事件侦听器的情况下,最新的侦听器会覆盖前一个侦听器。但为此,您必须定义一个命名回调函数而不是匿名回调函数。因为事件侦听器将两个匿名回调函数视为不同的并保持两者附加。请参阅此https://jsfiddle.net/hr5d3zuw/ (2认同)

Den*_*ret 7

使用jquery可以data("events")在任何对象(这里是窗口)上使用:

var hasbeforeunload = $(window).data("events") && $(window).data("events").['beforeunload'];
Run Code Online (Sandbox Code Playgroud)

但这仅适用于jquery添加的事件.

在更一般的情况下,您应该只是存储您在某处添加侦听器的信息:

   var addedListeners = {};
   function addWindowListenerIfNone(eventType, fun) {
      if (addedListeners[eventType]) return;
      addedListeners[eventType] = fun;
      window.addEventListener(eventType, fun);
   }
Run Code Online (Sandbox Code Playgroud)

我认为javascript中没有标准的方法来获取现有的事件处理程序.最好你可以附加Node的addEventListener函数来拦截和存储监听器,但我不推荐它...

编辑:

从jQuery 1.8开始,可以使用事件数据$._data(element, "events").更改日志有一个警告,应该考虑到:

请注意,这不是受支持的公共接口; 实际的数据结构可能会因版本不同而发生变化.


Var*_*mar 7

在 Chrome 开发工具中,您可以检查附加到元素的所有事件(用于调试)-

// print all events attached to document
var eventObjectAttachedToDocument = getEventListeners(document);

for (var event in eventObjectAttachedToDocument) {
    console.log(event);
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述