28

我想为beforeunload. 这是我的伪代码:

if(window.hasEventListener('beforeunload') === false) {
     window.addEventListener('beforeunload', function() { ... }, false);
}

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

4

3 回答 3

36

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

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

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

于 2015-02-19T13:22:51.833 回答
11

使用 jquery,您可以data("events")在任何对象(此处为窗口)上使用:

var hasbeforeunload = $(window).data("events") && $(window).data("events").['beforeunload'];

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

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

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

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

编辑 :

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

请注意,这不是受支持的公共接口;实际数据结构可能因版本而异。

于 2012-07-11T10:32:13.460 回答
5

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

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

for (var event in eventObjectAttachedToDocument) {
    console.log(event);
}

在此处输入图像描述

于 2018-07-04T14:04:40.500 回答