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 метод.
в Chrome Dev tool вы можете проверить все события, прикрепленные к элементу (для отладки) -
// print all events attached to document
var eventObjectAttachedToDocument = getEventListeners(document);
for (var event in eventObjectAttachedToDocument) {
console.log(event);
}