Skip to content

Instantly share code, notes, and snippets.

@adriancmiranda
Last active October 8, 2015 04:40
Show Gist options
  • Save adriancmiranda/ee75c3d2b2ac024c6746 to your computer and use it in GitHub Desktop.
Save adriancmiranda/ee75c3d2b2ac024c6746 to your computer and use it in GitHub Desktop.
define([
'../utilities/Map',
'../common/proxy'
], function(Map, proxy){
'use strict';
var EventEmitter = function(){
this.listeners = {};
};
EventEmitter.prototype.on = function(event, groupName, callback){
var hasGroup = (arguments.length === 3);
var group = hasGroup ? groupName : undefined;
var fn = hasGroup ? callback : groupName;
fn.__groupName = group;
this.listeners[event] = this.listeners[event] || [];
this.listeners[event].push(fn);
return this;
};
EventEmitter.prototype.off = function(event, callback){
var index, listeners = this.listeners[event];
if(!listeners){
return this;
}
if(arguments.length === 1){
delete this.listeners[event];
return this;
}
index = Map.indexOf(listeners, callback);
listeners.splice(index, 1);
if(listeners.length === 0){
delete this.listeners[event];
}
return this;
};
EventEmitter.prototype.once = function(event, groupName, callback){
var hasGroup = (arguments.length === 3);
var group = hasGroup ? groupName : undefined;
var fn = hasGroup ? callback : groupName;
var on = proxy(function(){
this.off(event, on);
fn.apply(this, arguments);
}, this);
this.on(event, group, on);
return this;
};
EventEmitter.prototype.trigger = function(event){
var args = [].slice.call(arguments, 1);
var listeners, index, total;
var callbacks = this.listeners[event];
var specialCallbacks = this.getWildcardListeners(event);
if(callbacks){
listeners = callbacks.slice();
for(index = 0, total = listeners.length; index < total; ++index){
if(listeners[index]){
listeners[index].apply(this, args);
}else{
break;
}
}
}
if(specialCallbacks){
listeners = specialCallbacks.slice();
for(index = 0, total = listeners.length; index < total; ++index){
if(listeners[index]){
listeners[index].apply(this, [event].concat(args));
}else{
break;
}
}
}
return this;
};
EventEmitter.prototype.releaseGroup = function(groupName){
for(var item in this.listeners){
var handlers = this.listeners[item];
for(var index = 0, total = handlers.length; index < total; index++){
if(handlers[index].__groupName === groupName){
handlers.splice(index, 1);
index--;
total--;
}
}
}
return this;
};
EventEmitter.prototype.getWildcardListeners = function(eventName){
var result = [];
for(var item in this.listeners){
if(Object.prototype.hasOwnProperty.call(this.listeners, item)){
var split = item.split('*');
if (item === '*' || (split.length === 2 && eventName.slice(0, split[0].length) === split[0])){
result = result.concat(this.listeners[item]);
}
}
}
return result;
};
return EventEmitter;
});
// Original: http://dean.edwards.name/my/events.js
function event(evt){
evt.preventDefault = event.preventDefault;
evt.stopPropagation = event.stopPropagation;
return evt;
};
event.preventDefault = function(){
this.returnValue = false;
};
event.stopPropagation = function(){
this.cancelBubble = true;
};
var EventProxy = function(target){
this.target = target||window;
this.on.guid = 1;
};
EventProxy.prototype.on = function(event, callback){
if(!this.target) return;
if(this.target.addEventListener){
this.target.addEventListener(event, callback, false);
}else{
callback.__guid = callback.__guid||this.on.guid++;
this.target.events = this.target.events||{};
if(!this.target.events[event]){
this.target.events[event] = {};
if(this.target['on'+ event]){
this.target.events[event][0] = this.target['on'+ event];
}
}
this.target.events[event][callback.__guid] = callback;
this.target['on'+event] = this.on.notify;
}
};
EventProxy.prototype.on.notify = function(evt){
evt = evt || event(((this.ownerDocument||this.document||this).parentWindow||window).event);
var key, listeners = this.events[evt.type];
for(key in listeners){
this.__notifier = listeners[key];
if(this.__notifier(evt) === false){
return false;
}
}
return true;
};
EventProxy.prototype.off = function(event, callback){
if(!this.target) return;
if(this.target.removeEventListener){
this.target.removeEventListener(event, callback);
}else if(this.target.events && this.target.events[event]){
delete this.target.events[event][callback.__guid];
}
};
window.onresize = function(){console.log('onResize from hell')};
var proxy = new EventProxy();
proxy.on('resize', arrange)
proxy.on('resize', resize)
proxy.off('resize', resize);
//proxy.off('resize', arrange);
function resize(evt){
console.log('Redimensionando', evt);
}
function arrange(evt){
console.log('Reorganizando', evt);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment