You must override EventTarget.prototype.addEventListener to create a hook function to register all calls to the 'add listener'. Something like that:
var _listeners = []; EventTarget.prototype.addEventListenerBase = EventTarget.prototype.addEventListener; EventTarget.prototype.addEventListener = function(type, listener) { _listeners.push({target: this, type: type, listener: listener}); this.addEventListenerBase(type, listener); };
Then you can create EventTarget.prototype.removeEventListener s :
EventTarget.prototype.removeEventListeners = function(targetType) { for(var index = 0; index != _listeners.length; index++) { var item = _listeners[index]; var target = item.target; var type = item.type; var listener = item.listener; if(target == this && type == targetType) { this.removeEventListener(type, listener); } } }
In ES6, you can use Symbol to hide the original function and the list of all added listeners directly in the self-using object.
(function() { let target = EventTarget.prototype; let functionName = 'addEventListener'; let func = target[functionName]; let symbolHidden = Symbol('hidden'); function hidden(instance) { if(instance[symbolHidden] === undefined) { let area = {}; instance[symbolHidden] = area; return area; } return instance[symbolHidden]; } function listenersFrom(instance) { let area = hidden(instance); if(!area.listeners) { area.listeners = []; } return area.listeners; } target[functionName] = function(type, listener) { let listeners = listenersFrom(this); listeners.push({ type, listener }); func.apply(this, [type, listener]); }; target['removeEventListeners'] = function(targetType) { let self = this; let listeners = listenersFrom(this); let removed = []; listeners.forEach(item => { let type = item.type; let listener = item.listener; if(type == targetType) { self.removeEventListener(type, listener); } }); }; })();
You can test this code with this little scissor:
document.addEventListener("DOMContentLoaded", event => { console.log('event 1'); }); document.addEventListener("DOMContentLoaded", event => { console.log('event 2'); }); document.addEventListener("click", event => { console.log('click event'); }); document.dispatchEvent(new Event('DOMContentLoaded')); document.removeEventListeners('DOMContentLoaded'); document.dispatchEvent(new Event('DOMContentLoaded'));
Martin Wantke Nov 05 '17 at 0:39 2017-11-05 00:39
source share