Je travaillais récemment avec des événements et je voulais voir / contrôler tous les événements dans une page. Après avoir examiné les solutions possibles, j'ai décidé de suivre ma propre voie et de créer un système personnalisé pour surveiller les événements. J'ai donc fait trois choses.
Tout d'abord, j'avais besoin d'un conteneur pour tous les écouteurs d'événements de la page: c'est l' EventListenersobjet. Il dispose de trois méthodes utiles: add(), remove()et get().
Ensuite, je créé un EventListenerobjet de tenir les informations nécessaires à l'événement, à savoir: target, type, callback, options, useCapture, wantsUntrusted, et a ajouté une méthode remove()pour supprimer l'auditeur.
Enfin, j'ai étendu le natif addEventListener()et les removeEventListener()méthodes pour les faire fonctionner avec les objets que j'ai créés ( EventListeneret EventListeners).
Usage:
var bodyClickEvent = document.body.addEventListener("click", function () {
console.log("body click");
});
// bodyClickEvent.remove();
addEventListener()crée un EventListenerobjet, l'ajoute EventListenerset le renvoie EventListener, afin qu'il puisse être supprimé ultérieurement.
EventListeners.get()peut être utilisé pour afficher les écouteurs dans la page. Il accepte un EventTargetou une chaîne (type d'événement).
// EventListeners.get(document.body);
// EventListeners.get("click");
Démo
Disons que nous voulons connaître tous les écouteurs d'événements dans cette page actuelle. Nous pouvons le faire (en supposant que vous utilisez une extension de gestionnaire de scripts, Tampermonkey dans ce cas). Le script suivant fait ceci:
// ==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);
Et quand nous listons tous les auditeurs, il est dit qu'il y a 299 auditeurs d'événements. Il semble qu'il y ait des doublons, mais je ne sais pas s'ils sont vraiment des doublons. Tous les types d'événements ne sont pas dupliqués, tous ces «doublons» peuvent donc être un écouteur individuel.

Le code peut être trouvé dans mon référentiel. Je ne voulais pas le poster ici car c'est assez long.
Mise à jour: cela ne semble pas fonctionner avec jQuery. Lorsque j'examine l'EventListener, je vois que le rappel est
function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}
Je crois que cela appartient à jQuery et n'est pas le rappel réel. jQuery stocke le rappel réel dans les propriétés de EventTarget:
$(document.body).click(function () {
console.log("jquery click");
});

Pour supprimer un écouteur d'événements, le rappel réel doit être transmis à la removeEventListener()méthode. Donc, pour que cela fonctionne avec jQuery, il doit être modifié davantage. Je pourrais résoudre ce problème à l'avenir.