JavaScript - как проверить, добавлено ли событие

Я хочу добавить слушателя ровно один раз для beforeunload. Это мой псевдокод:

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

Но hasEventListener не существует, очевидно. Как я могу это достичь? Спасибо.

Ответы

Ответ 1

Используя 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 для получения существующих обработчиков событий. В лучшем случае вы можете зарядить функцию addEventListener Node, чтобы перехватить и сохранить прослушиватели, но я не рекомендую...

EDIT:

Из jQuery 1.8 данные событий доступны в $._data(element, "events"). В журнале изменений есть предупреждение, которое следует учитывать:

Обратите внимание, что это не поддерживаемый публичный интерфейс; фактические данные структуры могут изменяться несовместимо с версией на версию.

Ответ 2

На самом деле нет необходимости проверять, добавлен ли слушатель в цель:

Если несколько идентичных EventListeners зарегистрированы на одном EventTarget с теми же параметрами, дубликаты экземпляров будут отброшены. Они не вызывают вызов EventListener дважды, и поскольку дубликаты отбрасываются, их не нужно удалять вручную с помощью метода removeEventListener.

Источник: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener#Multiple_identical_event_listeners