litejs
Version:
Single-page application framework
97 lines (83 loc) • 2.29 kB
JavaScript
!function(exports) {
var empty = []
exports.Emitter = EventEmitter
exports.asEmitter = asEmitter
function EventEmitter() {}
function asEmitter(obj) {
obj.on = on
obj.off = off
obj.one = one
obj.emit = emit
obj.listen = listen
obj.unlisten = unlisten
}
asEmitter(EventEmitter.prototype)
function on(type, fn, scope, _origin) {
var emitter = this === exports ? empty : this
, events = emitter._e || (emitter._e = Object.create(null))
if (type && fn) {
if (typeof fn === "string") fn = emit.bind(null, fn)
emit.call(emitter, "newListener", type, fn, scope, _origin)
;(events[type] || (events[type] = [])).unshift(scope, _origin, fn)
}
return emitter
}
function off(type, fn, scope) {
var i, args
, emitter = this === exports ? empty : this
, events = emitter._e && emitter._e[type]
if (events) {
for (i = events.length - 2; i > 0; i -= 3) {
if ((events[i + 1] === fn || events[i] === fn) && events[i - 1] == scope) {
args = events.splice(i - 1, 3)
emit.call(emitter, "removeListener", type, args[2], args[0], args[1])
if (fn) break
}
}
}
return emitter
}
function one(type, fn, scope) {
var emitter = this === exports ? empty : this
function remove() {
emitter.off(type, fn, scope).off(type, remove, scope)
}
return emitter.on(type, remove, scope).on(type, fn, scope)
}
// emitNext
// emitLate
function emit(type) {
var args, i
, emitter = this === exports ? empty : this
, _e = emitter._e
, arr = _e ? (_e[type] || empty).concat(_e["*"] || empty) : empty
_e = 0
if (i = arr.length) {
for (args = arr.slice.call(arguments, 1); i--; ) {
arr[i--].apply(arr[--i] || emitter, args)
_e++
}
}
return _e
}
function listen(emitter, ev, fn, scope, _origin) {
if (emitter) {
emitter.on(ev, fn, scope)
;(this._l || (this._l = [])).push([emitter, ev, fn, scope, _origin])
}
return this
}
function unlisten(key) {
var a, i
, listening = this._l
if (listening) for (i = listening.length; i--; ) {
a = listening[i]
if (key === "*" || a.indexOf(key) > -1) {
listening.splice(i, 1)
a[0].off(a[1], a[2], a[3])
}
}
return this
}
// `this` refers to the `window` in browser and to the `exports` in Node.js.
}(this.Event || this)