UNPKG

nhz.lib

Version:
94 lines (84 loc) 2.73 kB
/* 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'));