Skip to content

Instantly share code, notes, and snippets.

@bitsmanent
Last active October 10, 2016 17:37
Show Gist options
  • Select an option

  • Save bitsmanent/853c73689f5561ef4ebf8403936ef44d to your computer and use it in GitHub Desktop.

Select an option

Save bitsmanent/853c73689f5561ef4ebf8403936ef44d to your computer and use it in GitHub Desktop.
(Un)Install event handlers - Provides on() and off() functions. WIP
var eventsmap = [];
function on(elems, evnm, callback) {
var i, len, uuid;
if(elems.length == undefined)
elems = [elems];
len = elems.length;
if(!len)
return;
for(i = 0; i < len; ++i) {
if(elems[i].__id == undefined) {
uuid = eventsmap.length;
elems[i].__id = uuid;
}
else
uuid = elems[i].__id;
if(eventsmap[uuid] == undefined)
eventsmap[uuid] = {};
if(eventsmap[uuid][evnm] == undefined) {
eventsmap[uuid][evnm] = [];
elems[i].addEventListener(evnm, onevent, false);
}
eventsmap[uuid][evnm].push(callback);
}
}
function off(elems, evnm, callback) {
var uuid, i, ilen, j, jlen;
if(elems.length == undefined)
elems = [elems];
ilen = elems.length;
if(!ilen)
return;
for(i = 0, ilen = elems.length; i < ilen; ++i) {
uuid = elems[i].__id;
for(j = 0, jlen = eventsmap[uuid][evnm].length; j < jlen; ++j) {
if(!callback || eventsmap[uuid][evnm][j] == callback) {
eventsmap[uuid][evnm].splice(j, 1);
if(eventsmap[uuid][evnm].length == 0) {
elems[i].removeEventListener(evnm, onevent, false);
delete eventsmap[uuid][evnm];
}
}
}
if(eventsmap[uuid].length == 0)
eventsmap.splice(uuid, 1);
}
}
function onevent(ev) {
var uuid = this.__id, evnm = ev.type, cbs = eventsmap[uuid][evnm];
var i, len, r, cbs, rv = null;
for(i = 0, len = cbs.length; i < len; ++i) {
r = cbs[i].apply(this, [ev]);
if(rv == null && r != undefined && !r) {
rv = 0;
continue;
}
}
if(rv == 0) {
ev.stopPropagation();
ev.preventDefault();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment