1: Prototype.observe
использует Element.addEventListener (см. исходный код )
2: Вы можете переопределить Element.addEventListener
, чтобы запомнить добавленных слушателей (удобное свойство EventListenerList
было удалено из предложения спецификации DOM3). Запустите этот код, прежде чем любое событие будет прикреплено:
(function() {
Element.prototype._addEventListener = Element.prototype.addEventListener;
Element.prototype.addEventListener = function(a,b,c) {
this._addEventListener(a,b,c);
if(!this.eventListenerList) this.eventListenerList = {};
if(!this.eventListenerList[a]) this.eventListenerList[a] = [];
this.eventListenerList[a].push(b);
};
})();
Читать все события по:
var clicks = someElement.eventListenerList.click;
if(clicks) clicks.forEach(function(f) {
alert("I listen to this function: "+f.toString());
});
И не забудьте переопределить Element.removeEventListener
, чтобы удалить событие из пользовательского Element.eventListenerList
.
3: свойство Element.onclick
нуждается в особом уходе здесь:
if(someElement.onclick)
alert("I also listen tho this: "+someElement.onclick.toString());
4: не забывайте атрибут содержимого Element.onclick
: это две разные вещи:
someElement.onclick = someHandler; // IDL attribute
someElement.setAttribute("onclick","otherHandler(event)"); // content attribute
Так что вам тоже нужно с этим справиться:
var click = someElement.getAttribute("onclick");
if(click) alert("I even listen to this: "+click);
Букмарклет Visual Event (упомянутый в самом популярном ответе) только крадет кэш пользовательского обработчика библиотеки:
Оказывается, что W3C не предоставляет стандартный метод
Рекомендуемый интерфейс DOM, чтобы узнать, какие слушатели событий
прикреплен к определенному элементу. Хотя это может показаться
надзор, было предложение включить свойство под названием
eventListenerList к спецификации DOM уровня 3, но был
к сожалению был удален в более поздних черновиках. Таким образом, мы вынуждены
посмотрел на отдельные библиотеки Javascript, которые обычно
поддерживать кэш прикрепленных событий (чтобы их потом можно было удалить и
выполнить другие полезные абстракции).
Таким образом, чтобы визуальное событие отображало события, оно должно иметь возможность
проанализировать информацию о событии из библиотеки Javascript.
Переопределение элементов может быть сомнительным (т. Е. Потому, что есть некоторые специфические функции DOM, такие как живые коллекции, которые не могут быть закодированы в JS), но он изначально поддерживает eventListenerList и работает в Chrome, Firefox и Opera (не работа в IE7).