Last active
October 14, 2015 00:28
-
-
Save braitsch/4279868 to your computer and use it in GitHub Desktop.
Simple Event Dispatcher to register any Object or DOM element to listen for custom events and take appropriate action based on who dispatched it.
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
/* | |
Simple Event Dispatcher | |
Author : Stephen Braitsch | |
------------------------------------------------------------------ | |
Example Usage : | |
var MY_CUSTOM_EVENT = 'my-custom-event'; | |
var myObj = { name : 'stephen'}; | |
myObj.dispatch(MY_CUSTOM_EVENT); | |
function onCustomEvent(evt) | |
{ | |
console.log(evt.type, evt.target); | |
// prints : MY_CUSTOM_EVENT, { name : 'stephen'}; | |
} | |
window.addListener(MY_CUSTOM_EVENT, onCustomEvent); | |
------------------------------------------------------------------ | |
Example Usage w/ jQuery : | |
var MY_CUSTOM_EVENT = 'my-custom-event'; | |
$('#myDiv).click(function(){ | |
$(this).dispatch(MY_CUSTOM_EVENT); | |
}) | |
function onCustomEvent(evt) | |
{ | |
if (evt.target.attr(id) == 'myDiv'){ | |
console.log('you clicked myDiv); | |
} | |
} | |
window.addListener(MY_CUSTOM_EVENT, onCustomEvent); | |
*/ | |
window.EventDispatcher = new function(){ | |
var __events = []; | |
Object.defineProperty(Object.prototype, "addListener", { | |
value: function(e, f) { | |
for (var i = __events.length - 1; i >= 0; i--){ | |
// check if this event is already registered with the dispatcher // | |
if (__events[i].name == e){ | |
// if it is, check if this object is already registered to listen for the event // | |
for (var k = __events[i].listeners.length - 1; k >= 0; k--){ | |
if (__events[i].listeners[k].obj == this) { | |
console.log(this + 'is already registered to listen for '+e); | |
return; | |
} | |
}; | |
// if the dispatcher already knows about the event, but this object is not yet registered to listen for it, let's add it. | |
__events[i].listeners.push({obj:this, func:f}); | |
// console.log('registering '+this+' to listen for '+e); | |
return; | |
} | |
}; | |
// if this event is not yet registered with the dispatcher add it to the events array // | |
// console.log('listening for a new event '+e); | |
__events.push({name : e, listeners:[{obj:this, func:f}]}); | |
}, | |
enumerable : false | |
}); | |
Object.defineProperty(Object.prototype, "removeListener", { | |
value: function(e) { | |
for (var i = __events.length - 1; i >= 0; i--){ | |
if (__events[i].name == e){ | |
for (var k = __events[i].listeners.length - 1; k >= 0; k--){ | |
if (__events[i].listeners[k].obj == this) __events[i].listeners.splice(k, 1); | |
}; | |
} | |
} | |
}, | |
enumerable : false | |
}); | |
Object.defineProperty(Object.prototype, "dispatch", { | |
value: function(e) { | |
for (var i = __events.length - 1; i >= 0; i--){ | |
if (__events[i].name == e){ | |
for (var k = __events[i].listeners.length - 1; k >= 0; k--){ | |
__events[i].listeners[k].func({type:e, target:this}); | |
}; | |
} | |
}; | |
}, | |
enumerable : false | |
}); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment