Skip to content

Instantly share code, notes, and snippets.

@miya2000
Created June 29, 2010 14:59
Show Gist options
  • Select an option

  • Save miya2000/457318 to your computer and use it in GitHub Desktop.

Select an option

Save miya2000/457318 to your computer and use it in GitHub Desktop.
/**
* EventDispatcher
* @see http://www.fladdict.net/blog-jp/archives/2005/06/javascript.php
* @see http://nanto.asablo.jp/blog/2007/03/23/1339498
*/
function EventDispatcher(thisObj) {
if (this instanceof EventDispatcher) {
this.addEventListener = addEventListener;
this.removeEventListener = removeEventListener;
this.dispatchEvent = dispatchEvent;
}
if (thisObj) {
thisObj.addEventListener = addEventListener;
thisObj.removeEventListener = removeEventListener;
thisObj.dispatchEvent = dispatchEvent;
}
var ec = {};
function addEventListener(type, listener) {
if (typeof listener != 'function') return;
if (ec[type] == null) { ec[type] = [listener]; return; }
var listeners = ec[type];
for (var i = 0, len = listeners.length; i < len; i++) {
if (listeners[i] === listener) { return; }
}
listeners.push(listener);
}
function removeEventListener(type, listener) {
if (ec[type] == null) return;
var listeners = ec[type];
for (var i = 0, len = listeners.length; i < len; i++) {
if (listeners[i] === listener) { listeners.splice(i, 1); break; }
}
}
function dispatchEvent(event) {
if (ec[event.type] == null) return true;
event.target = this;
event.currentTarget = this;
event.eventPhase = 2; // support target phase only.
var canceled = false;
event.preventDefault = function preventDefault() { if (event.cancelable) canceled = true; };
event.stopPropagation = function stopPropagation() {};
var listeners = ec[event.type];
for (var i = 0, len = listeners.length; i < len; i++) {
var res = listeners[i].call(event.currentTarget, event);
if (event.cancelable && !canceled) {
if (res == false || event.returnValue == false) canceled = true;
}
}
return !canceled;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment