Как уже упоминалось в других ответах, поскольку вы пометили этот вопрос с помощью jQuery, нет смысла пытаться добавлять и отслеживать события с помощью простого JavaScript, подобного этому. Кроме того, способ, которым вы, кажется, делаете это, на самом деле ничего не отслеживает, потому что вы вручную добавляете ссылку на функцию к своим listeners
свойствам, независимо от фактического назначения их обработчикам событий на элементах. Когда вы делаете это, нет никакого способа гарантировать, что те, кого вы «отслеживаете», действительно будут вызываться при возникновении события.
Если вы настаиваете на том, чтобы избегать jQuery, вот пример того, как вы можете добавить несколько обработчиков к нескольким событиям и отслеживать, какие функции были назначены для обработки каких событий позже:
function addTrackedListener(element, type, handler) {
if (!element.trackedEvents) {
element.trackedEvents = {};
}
if (!element.trackedEvents[type]) {
element.trackedEvents[type] = [];
}
element.trackedEvents[type].push(handler);
element[type] = function () {
handleAllEvents(element.trackedEvents[type]);
};
}
function handleAllEvents(events) {
for (var i = 0, l = events.length; i < l; i++) {
events[i]();
}
}
Пример использования:
// grab some element
var div = document.getElementById('test');
// add a click handler to it
addTrackedListener(div, 'onclick', function() {
console.log('first handler');
});
// add another click handler to it
addTrackedListener(div, 'onclick', function() {
console.log('second handler');
});
Когда сработает событие click, вы увидите это на своей консоли:
first handler
second handler
И если вы проверите div.trackedEvents
, вы увидите свойство для каждого типа события, значение которого будет массивом всех функций, которые будут выполняться при запуске этого события.