nhz.lib
Version:
NHZ Library
94 lines (84 loc) • 2.73 kB
JavaScript
/* mixin.EventTarget */
var Event, EventTarget,
extend = require("extends__"),
hasProp = {}.hasOwnProperty;
Event = require('./event');
module.exports = EventTarget = (function(superClass) {
extend(EventTarget, superClass);
function EventTarget() {
Object.defineProperties(this, {
___is_event_target: {
configurable: false,
enumerable: false,
writable: false,
value: true
},
___listeners: {
configurable: false,
enumerable: false,
writable: false,
value: {}
}
});
}
EventTarget.prototype.addEventListener = function(type, listener, phase) {
var base, listeners;
if (phase == null) {
phase = Event.BUBBLING_PHASE;
}
if (type && type.length && (typeof type === 'string') && listener instanceof Function) {
if (phase === Event.BUBBLING_PHASE || phase === Event.CAPTURING_PHASE) {
listeners = ((base = this.___listeners)[phase] || (base[phase] = {}));
listeners = (listeners[type] || (listeners[type] = []));
if (-1 === listeners.indexOf(listener)) {
listeners.push(listener);
}
}
}
return this;
};
EventTarget.prototype.removeEventListener = function(type, listener, phase) {
var idx, listeners;
if (phase == null) {
phase = Event.BUBBLING_PHASE;
}
if (type && type.length && (typeof type === 'string') && listener instanceof Function) {
if (phase === Event.BUBBLING_PHASE || phase === Event.CAPTURING_PHASE) {
if (listeners = this.___listeners[phase]) {
if (listeners = listeners[type]) {
if (-1 !== (idx = listeners.indexOf(listener))) {
listeners.splice(idx, 1);
}
if (listeners.length === 0) {
delete this.___listeners[phase][type];
}
}
}
}
}
return this;
};
EventTarget.prototype.dispatchEvent = function(event) {
var i, len, listener, listeners, phase, ref, type;
if ((event != null ? event.___is_event : void 0) && (type = event.type)) {
if (event.target === this) {
phase = event.___phase = Event.BUBBLING_PHASE;
} else {
if (!(phase = event.phase)) {
phase = event.___phase = Event.CAPTURING_PHASE;
}
}
if (listeners = (ref = this.___listeners[phase]) != null ? ref[type] : void 0) {
for (i = 0, len = listeners.length; i < len; i++) {
listener = listeners[i];
if (event.stopped || event.stoppedImmediate) {
break;
}
listener.call(this, event);
}
}
}
return this;
};
return EventTarget;
})(require('./base'));