-
Notifications
You must be signed in to change notification settings - Fork 330
/
Copy pathEventEmitter.js
129 lines (121 loc) · 3.56 KB
/
EventEmitter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
module.exports = EventEmitter;
/**
* Base class for objects that dispatches events.
* @class EventEmitter
* @constructor
* @example
* var emitter = new EventEmitter();
* emitter.on('myEvent', function(evt){
* console.log(evt.message);
* });
* emitter.emit({
* type: 'myEvent',
* message: 'Hello world!'
* });
*/
function EventEmitter() {
}
EventEmitter.prototype = {
constructor: EventEmitter,
/**
* Add an event listener
* @method on
* @param {String} type
* @param {Function} listener
* @return {EventEmitter} The self object, for chainability.
* @example
* emitter.on('myEvent', function(evt){
* console.log('myEvt was triggered!');
* });
*/
on: function ( type, listener, context ) {
listener.context = context || this;
if ( this._listeners === undefined ){
this._listeners = {};
}
var listeners = this._listeners;
if ( listeners[ type ] === undefined ) {
listeners[ type ] = [];
}
if ( listeners[ type ].indexOf( listener ) === - 1 ) {
listeners[ type ].push( listener );
}
return this;
},
/**
* Remove an event listener
* @method off
* @param {String} type
* @param {Function} listener
* @return {EventEmitter} The self object, for chainability.
* @example
* emitter.on('myEvent', handler); // Add handler
* emitter.off('myEvent', handler); // Remove handler
*/
off: function ( type, listener ) {
var listeners = this._listeners;
if(!listeners || !listeners[type]){
return this;
}
var index = listeners[ type ].indexOf( listener );
if ( index !== - 1 ) {
listeners[ type ].splice( index, 1 );
}
return this;
},
/**
* Check if an event listener is added
* @method has
* @param {String} type
* @param {Function} listener
* @return {Boolean}
*/
has: function ( type, listener ) {
if ( this._listeners === undefined ){
return false;
}
var listeners = this._listeners;
if(listener){
if ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) {
return true;
}
} else {
if ( listeners[ type ] !== undefined ) {
return true;
}
}
return false;
},
/**
* Emit an event.
* @method emit
* @param {Object} event
* @param {String} event.type
* @return {EventEmitter} The self object, for chainability.
* @example
* emitter.emit({
* type: 'myEvent',
* customData: 123
* });
*/
emit: function ( event ) {
if ( this._listeners === undefined ){
return this;
}
var listeners = this._listeners;
var listenerArray = listeners[ event.type ];
if ( listenerArray !== undefined ) {
event.target = this;
// Need to copy the listener array, in case some listener was added/removed inside a listener
var tmpArray = [];
for (var i = 0, l = listenerArray.length; i < l; i++) {
tmpArray[i] = listenerArray[i];
}
for (var i = 0, l = tmpArray.length; i < l; i++) {
var listener = tmpArray[ i ];
listener.call( listener.context, event );
}
}
return this;
}
};