Jeśli naprawdę chcesz to zrobić, możesz zastąpić addEventListener
, aby śledzić rejestrowane i uruchamiane zdarzenia.
var myEventManager = (function() {
var old = EventTarget.prototype.addEventListener,
listeners = [],
events = [];
EventTarget.prototype.addEventListener = function(type, listener) {
function new_listener(listener) {
return function(e) {
events.push(e); // remember event
return listener.call(this, e); // call original listener
};
}
listeners.push([type, listener]); // remember call
return old.call(this, type, new_listener(listener)); // call original
};
return {
get_events: function() { return events; },
get_listeners: function() {return listeners; }
};
}());
Jednakże, istnieje niezliczona ilość powodów, aby nie to zrobić, nie tylko fakt, że będzie szybko zabraknie pamięci, jak nagrywać tysiące wydarzeń, takich jak ruchy myszką. Nie spowoduje to również przechwycenia detektorów zdarzeń w taki sposób, jak elt.onclick
. Oczywiście nie złapie też słuchaczy skonfigurowanych za pomocą starego API IE attachEvent
. Co najważniejsze, nie pomoże ci to, które zdarzenia są generowane i odsłuchiwane wewnętrznie, na przykład kliknięcie myszą w polu wyboru. (Kompletne rozwiązanie wymagałoby również obsługę removeEventListener
.)
Można również zastąpić createEvent
i dispatch
w podobny sposób, ale znowu, że będzie przechwytywać tylko te wydarzenia, które są wprost stworzone lub wysyłane w kodzie JS.
Jeśli naprawdę chcesz robić to, na co masz ochotę, prawdopodobnie musisz rozwidlić Chrome.
Tak, pierwsze pytanie: dlaczego? To cudowne, że chcesz to zrobić, ale jest też bardzo dziwne. –
Niezależnie od tego, jaki problem jest wymagany, są one prawdopodobnie lepszą alternatywą. Możesz łatwo poradzić sobie z wydarzeniami syntetycznymi, a także elementami tworzonymi dynamicznie (istnieją sposoby wykrywania kiedy tworzony jest element). – Markasoftware
To brzmi całkiem fajnie. nie słuchajcie innych, którzy was poniżają. –