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

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

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

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

3 ответов


используя 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 узла для перехвата и хранения слушателей, но я не рекомендовать ее...

EDIT:

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

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


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

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

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


в Chrome Dev tool вы можете проверить все события, прикрепленные к элементу (для отладки) -

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

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

enter image description here