Skip to content

Instantly share code, notes, and snippets.

@19h
Created August 8, 2011 17:34
Show Gist options
  • Save 19h/1132253 to your computer and use it in GitHub Desktop.
Save 19h/1132253 to your computer and use it in GitHub Desktop.
Cross-Compatible Event Listening / Firing
/* Copyright (c) Kenan Sulayman, et al. Do what ever you want, as long as you're crediting the AUTOR. */
Function.prototype.bind = function (object) {
var method = this;
return function () {
return method.apply(object, arguments);
};
};
function EX() {
this.events = [];
this.builtinEvts = [];
}
EX.prototype.getActionIdx = function (obj, evt, action, binding) {
if (obj && evt) {
var curel = this.events[obj][evt];
if (curel) {
var len = curel.length;
for (var i = len - 1; i >= 0; i--) {
if (curel[i].action == action && curel[i].binding == binding) {
return i;
}
}
} else {
return -1;
}
}
return -1;
};
EX.prototype.addListener = function (obj, evt, action, binding) {
if (this.events[obj]) {
if (this.events[obj][evt]) {
if (this.getActionIdx(obj, evt, action, binding) == -1) {
var curevt = this.events[obj][evt];
curevt[curevt.length] = {
action: action,
binding: binding
};
}
} else {
this.events[obj][evt] = [];
this.events[obj][evt][0] = {
action: action,
binding: binding
};
}
} else {
this.events[obj] = [];
this.events[obj][evt] = [];
this.events[obj][evt][0] = {
action: action,
binding: binding
};
}
};
EX.prototype.removeListener = function (obj, evt, action, binding) {
if (this.events[obj]) {
if (this.events[obj][evt]) {
var idx = this.actionExists(obj, evt, action, binding);
if (idx >= 0)
this.events[obj][evt].splice(idx, 1);
}
}
};
EX.prototype.fireEvent = function (e, obj, evt, args) {
if (!e)
e = window.event;
if (obj && this.events) {
var evtel = this.events[obj];
if (evtel) {
var curel = evtel[evt];
if (curel) {
for (var act in curel) {
var action = curel[act].action;
if (curel[act].binding) {
action = action.bind(curel[act].binding);
}
try{
action(e, args);
} catch (e) {}
}
}
}
}
};
var Events = {
NS: new EX(),
listen: function ( o, e, strct, f, b ) { this.C[o] = function() { (function(){ e(); this.C[o](); }); }; return this.NS.addListener ( o, this.C[o], f, b ); },
fire: function ( err, o, e, a ) { return this.NS.fireEvent ( err, o, e, a ); },
remove: function ( o, e, a, b ) { return this.NS.removeListener ( o, e, a, b ); },
idx: function ( o, e, a, b ) { return this.NS.getActionIdx ( o, e, a, b ); }
}
function Evt() {}
Evt.prototype.fire = function ( e ) {
Events.fire(null, this, e);
};
Evt.prototype.listen = function ( e, f ) {
return Events.NS.addListener(this, e, f);
}
function fire ( e ) { return Evx.fire ( e ); }
function listen ( e, f ) { return Evx.listen ( e, f ); }
var Evx = new Evt();
/*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*/
// REMOVE IN PRODUCTION
// -*TEST*-
listen ( "load", function () {
return console.log("Hooray, it's working!");
});
fire( "load" )
/*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*--*TEST*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment