Skip to content

Instantly share code, notes, and snippets.

@braitsch
Last active October 14, 2015 00:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save braitsch/4279868 to your computer and use it in GitHub Desktop.
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.
/*
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