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' EventListeners
objet. Il dispose de trois méthodes utiles: add()
, remove()
et get()
.
Ensuite, je créé un EventListener
objet 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 ( EventListener
et EventListeners
).
Usage:
var bodyClickEvent = document.body.addEventListener("click", function () {
console.log("body click");
});
// bodyClickEvent.remove();
addEventListener()
crée un EventListener
objet, l'ajoute EventListeners
et 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 EventTarget
ou 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.