|
window.getEventListenersStats = function(selectorOrNode) { |
|
var domElements = []; |
|
if (selectorOrNode instanceof Node || selectorOrNode instanceof Window) { |
|
domElements = [selectorOrNode]; |
|
} else { |
|
domElements = Array.from([window, document, ...document.querySelectorAll(selectorOrNode || '*')]) |
|
} |
|
|
|
return domElements.reduce(function(pre1, dom){ |
|
var listeners = getEventListeners(dom); |
|
var eventTypes = Object.keys(listeners); |
|
|
|
var [handlersByType, nbHandlers] = eventTypes.reduce(function([preHandlersByType, preNbHandlers], eventType) { |
|
|
|
var nbHandersForThisType = listeners[eventType].length; |
|
|
|
if (!(eventType in preHandlersByType)) { |
|
preHandlersByType[eventType] = 0; |
|
} |
|
preHandlersByType[eventType] += nbHandersForThisType; |
|
|
|
preNbHandlers += nbHandersForThisType; |
|
|
|
return [preHandlersByType, preNbHandlers]; |
|
}, [pre1.handlersByType, 0]); |
|
|
|
pre1.handlersByType = handlersByType; |
|
pre1.handlers += nbHandlers; |
|
pre1.domElementWithListeners += nbHandlers > 0 ? 1 : 0; |
|
|
|
return pre1; |
|
}, { |
|
domElementWithListeners: 0, |
|
handlers: 0, |
|
handlersByType: {} |
|
}) |
|
}; |
|
console.info(`%c🦄 getEventListenersStats() |
|
%cUsage: %cgetEventListenersStats(<optional: domNode>) |
|
|
|
%cMore info at https://gist.github.com/thomasleveil/c280d8a6f77682a2d15c11e0e11846a8/`, |
|
"background: yellow; color: blue; font-size: 18pt", |
|
"font-size: 16pt; font-weight: bold", |
|
"color: darkgray; font-size: 14pt; font-family; Consolas", |
|
"color: lightgray; font-size: 12pt" |
|
); |
|
alert("You can now use `getEventListenersStats()` in the Chrome console"); |