Di recente ho lavorato con eventi e volevo visualizzare / controllare tutti gli eventi in una pagina. Dopo aver esaminato le possibili soluzioni, ho deciso di seguire la mia strada e creare un sistema personalizzato per monitorare gli eventi. Quindi, ho fatto tre cose.
Innanzitutto, avevo bisogno di un contenitore per tutti i listener di eventi nella pagina: questo è l' EventListeners
oggetto. Ha tre metodi utili: add()
, remove()
, e get()
.
Successivamente, ho creato un EventListener
oggetto per contenere le informazioni necessarie per l'evento, cioè: target
, type
, callback
, options
, useCapture
, wantsUntrusted
, e aggiunto un metodo remove()
per rimuovere l'ascoltatore.
Infine, ho esteso il metodo nativo addEventListener()
e i removeEventListener()
metodi per farli funzionare con gli oggetti che ho creato ( EventListener
e EventListeners
).
Uso:
var bodyClickEvent = document.body.addEventListener("click", function () {
console.log("body click");
});
// bodyClickEvent.remove();
addEventListener()
crea un EventListener
oggetto, lo aggiunge EventListeners
e restituisce l' EventListener
oggetto, in modo che possa essere rimosso in seguito.
EventListeners.get()
può essere utilizzato per visualizzare gli ascoltatori nella pagina. Accetta una EventTarget
o una stringa (tipo di evento).
// EventListeners.get(document.body);
// EventListeners.get("click");
dimostrazione
Diciamo che vogliamo conoscere tutti gli ascoltatori di eventi in questa pagina corrente. Possiamo farlo (supponendo che tu stia utilizzando un'estensione del gestore di script, Tampermonkey in questo caso). Il seguente script fa questo:
// ==UserScript==
// @name New Userscript
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @include https://stackoverflow.com/*
// @grant none
// ==/UserScript==
(function() {
fetch("https://raw.githubusercontent.com/akinuri/js-lib/master/EventListener.js")
.then(function (response) {
return response.text();
})
.then(function (text) {
eval(text);
window.EventListeners = EventListeners;
});
})(window);
E quando elenchiamo tutti gli ascoltatori, dice che ci sono 299 ascoltatori di eventi. "Sembra" che ci siano dei duplicati, ma non so se siano davvero duplicati. Non tutti i tipi di eventi sono duplicati, quindi tutti quei "duplicati" potrebbero essere un singolo ascoltatore.
Il codice può essere trovato nel mio repository. Non volevo pubblicarlo qui perché è piuttosto lungo.
Aggiornamento: questo non sembra funzionare con jQuery. Quando esamino EventListener, vedo che il callback è
function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}
Credo che questo appartenga a jQuery e non sia il vero callback. jQuery memorizza il callback effettivo nelle proprietà di EventTarget:
$(document.body).click(function () {
console.log("jquery click");
});
Per rimuovere un listener di eventi, il callback effettivo deve essere passato al removeEventListener()
metodo. Quindi, per farlo funzionare con jQuery, ha bisogno di ulteriori modifiche. Potrei risolverlo in futuro.