Created
November 27, 2012 21:42
-
-
Save artisonian/4157276 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function(){ | |
var BackboneEvents = { | |
on: function(events, callback, context) { | |
var ev; | |
events = events.split(/\s+/); | |
var calls = this._callbacks || (this._callbacks = {}); | |
while (ev = events.shift()) { | |
var list = calls[ev] || (calls[ev] = {}); | |
var tail = list.tail || (list.tail = list.next = {}); | |
tail.callback = callback; | |
tail.context = context; | |
list.tail = tail.next = {}; | |
} | |
return this; | |
}, | |
off: function(events, callback, context) { | |
var ev, calls, node; | |
if (!events) { | |
delete this._callbacks; | |
} else if (calls = this._callbacks) { | |
events = events.split(/\s+/); | |
while (ev = events.shift()) { | |
node = calls[ev]; | |
delete calls[ev]; | |
if (!callback || !node) continue; | |
// Create a new list, omitting the indicated event/context pairs. | |
while ((node = node.next) && node.next) { | |
if (node.callback === callback && | |
(!context || node.context === context)) continue; | |
this.on(ev, node.callback, node.context); | |
} | |
} | |
} | |
return this; | |
}, | |
trigger: function(events) { | |
var event, node, calls, tail, args, all, rest; | |
if (!(calls = this._callbacks)) return this; | |
all = calls['all']; | |
(events = events.split(/\s+/)).push(null); | |
// Save references to the current heads & tails. | |
while (event = events.shift()) { | |
if (all) events.push({next: all.next, tail: all.tail, event: event}); | |
if (!(node = calls[event])) continue; | |
events.push({next: node.next, tail: node.tail}); | |
} | |
// Traverse each list, stopping when the saved tail is reached. | |
rest = Array.prototype.slice.call(arguments, 1); | |
while (node = events.pop()) { | |
tail = node.tail; | |
args = node.event ? [node.event].concat(rest) : rest; | |
while ((node = node.next) !== tail) { | |
node.callback.apply(node.context || this, args); | |
} | |
} | |
return this; | |
} | |
}; | |
if (define) define(function(){ return BackboneEvents; }); | |
else if (module) module.exports = BackboneEvents; | |
else window.BackeboneEvents = BackboneEvents; | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment