Skip to content

Instantly share code, notes, and snippets.

@DanElliottPalmer
Created October 5, 2017 09:30
Show Gist options
  • Save DanElliottPalmer/e4522460fe9b0a777fe5e2b1c187ee48 to your computer and use it in GitHub Desktop.
Save DanElliottPalmer/e4522460fe9b0a777fe5e2b1c187ee48 to your computer and use it in GitHub Desktop.
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