Created
October 5, 2017 09:30
-
-
Save DanElliottPalmer/e4522460fe9b0a777fe5e2b1c187ee48 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function LazyEventListeners(){ | |
this._listeners = {}; | |
} | |
LazyEventListeners.prototype = { | |
constructor: LazyEventListeners, | |
has: function has(propertyKey){ | |
return this._listeners.hasOwnProperty(propertyKey); | |
}, | |
_createListener: function _createListener(propertyKey, eventTarget, | |
eventType, eventHandler){ | |
var listener = { | |
key: propertyKey, | |
target: eventTarget, | |
type: eventType, | |
handler: eventHandler, | |
value: undefined, | |
lastEvent: null, | |
listener: function(e){ | |
listener.lastEvent = e; | |
listener.ready = false; | |
}.bind(this), | |
ready: false | |
}; | |
eventTarget.addEventListener(eventType, listener.listener); | |
return listener; | |
}, | |
set: function set(propertyKey, eventTarget, eventType, eventHandler){ | |
if(this.has(propertyKey)){ | |
throw new Error(propertyKey + ' has already been assigned'); | |
} | |
this._listeners[propertyKey] = this._createListener( | |
propertyKey, eventTarget, eventType, eventHandler); | |
}, | |
get: function get(propertyKey){ | |
if(!this.has(propertyKey)) return; | |
var listener = this._listeners[propertyKey]; | |
if(!listener.ready){ | |
listener.value = listener.handler( | |
listener.value, listener.lastEvent); | |
listener.ready = true; | |
} | |
return listener.value; | |
}, | |
remove: function remove(propertyKey){ | |
if(!this.has(propertyKey)) return; | |
var listener = this._listeners[propertyKey]; | |
listener.target.removeEventListener(listener.type, listener.listener); | |
this._listeners[propertyKey] = null; | |
delete this._listeners[propertyKey]; | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment