Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function EventEmitter() {
- this._listeners = {};
- }
- EventEmitter.prototype = {
- on: function(event, callback, context, once) {
- var index = this._indexOf(event, callback, context);
- if (index != -1) {
- if (arguments.length > 3) {
- this._listeners[event][index].once = once;
- }
- return;
- }
- if (!{}.hasOwnProperty.call(this._listeners, event)) {
- this._listeners[event] = [];
- }
- this._listeners[event].push(
- {callback: callback, context: context, once: once});
- },
- once: function(event, callback, context) {
- this.on(event, callback, context, true);
- },
- /*
- * off() remove all listeners
- * off('foo') remove all listeners for event 'foo'
- * off('foo', function[, context]) remove listener for event 'foo' in a
- * certain context
- */
- off: function(event, callback, context) {
- if (!arguments.length) {
- this._listeners = {};
- return;
- }
- if (arguments.length == 1) {
- if ({}.hasOwnProperty.call(this._listeners, event)) {
- delete this._listeners[event];
- }
- return;
- }
- var index = this._indexOf(event, callback, context);
- if (index == -1) {
- return;
- }
- this._listeners[event].splice(index, 1);
- if (!this._listeners[event].length) {
- delete this._listeners[event];
- }
- },
- emit: function(event) {
- if (!arguments.length ||
- !{}.hasOwnProperty.call(this._listeners, event)) {
- return;
- }
- var args = [].slice.call(arguments, 1);
- var listeners = this._listeners[event];
- var i = 0;
- while (i < listeners.length) {
- listeners[i].callback.apply(listeners[i].context || this, args);
- if (listeners[i].once) {
- listeners.splice(i, 1);
- continue;
- }
- ++i;
- }
- if (!listeners.length) {
- delete this._listeners[event];
- }
- },
- _indexOf: function(event, callback, context) {
- if ({}.hasOwnProperty.call(this._listeners, event)) {
- var listeners = this._listeners[event];
- var i = listeners.length;
- while (i--) {
- if (callback == listeners[i].callback &&
- ((!context && !listeners[i].context)
- || listeners[i].context === context)) {
- return i;
- }
- }
- }
- return -1;
- },
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement