1
+
2
+ ( function ( factory ) {
3
+ "use strict" ;
4
+
5
+
6
+ if ( typeof define === "function" && define . amd ) {
7
+ define ( factory ) ;
8
+ }
9
+ else if ( typeof module === "object" ) {
10
+ module . exports = factory ( ) ;
11
+ }
12
+ else {
13
+ window . EventEmitter = factory ( ) ;
14
+ }
15
+
16
+
17
+ } ( function ( ) {
18
+ "use strict" ;
19
+
20
+
21
+ var EventEmitter = function ( ) {
22
+ this . _events = { } ;
23
+ this . _regexs = { } ;
24
+
25
+ return this ;
26
+ }
27
+
28
+
29
+
30
+
31
+ /**
32
+ * Utils
33
+ *
34
+ * 'Private' API
35
+ */
36
+
37
+ var copyArray = function ( arr , start , end ) {
38
+ var result = [ ] ;
39
+ if ( ! start ) {
40
+ start = 0 ;
41
+ }
42
+ if ( ! end ) {
43
+ end = arr . length ;
44
+ }
45
+
46
+ for ( var i = start ; i < end ; i ++ ) {
47
+ result . push ( arr [ i ] ) ;
48
+ }
49
+
50
+ return result ;
51
+ }
52
+
53
+ EventEmitter . prototype . execListener = function ( cb , args ) {
54
+ if ( typeof cb === "function" ) {
55
+ return cb . apply ( null , args ) ;
56
+ }
57
+ else if ( typeof cb === "object" && typeof cb . handleEvent === "function" ) {
58
+ return cb . handleEvent . apply ( cb , args ) ;
59
+ }
60
+ }
61
+
62
+ EventEmitter . prototype . eventRegex = function ( event ) {
63
+ return new RegExp ( event . replace ( "*" , ".*" ) ) ;
64
+ }
65
+
66
+
67
+
68
+
69
+ /**
70
+ * EventEmitter
71
+ *
72
+ * Public API
73
+ */
74
+
75
+ EventEmitter . prototype . emit = function ( event ) {
76
+ var args = copyArray ( arguments , 1 ) ;
77
+ args . push ( event ) ;
78
+
79
+ outer:
80
+ for ( var ev in this . _events ) {
81
+ var regex = this . _regexs [ ev ] ;
82
+ if ( regex . test ( event ) ) {
83
+ var listeners = this . _events [ ev ] ;
84
+ for ( var i = 0 , len = listeners . length ; i < len ; i ++ ) {
85
+ var res = this . execListener ( listeners [ i ] , args , event ) ;
86
+ if ( res === false ) {
87
+ break outer;
88
+ }
89
+ }
90
+ }
91
+ }
92
+
93
+ return this ;
94
+ }
95
+
96
+ EventEmitter . prototype . on =
97
+ EventEmitter . prototype . addListener =
98
+ EventEmitter . prototype . addEventListener =
99
+ function ( event , cb ) {
100
+ if ( ! this . _events [ event ] ) {
101
+ this . _events [ event ] = [ ] ;
102
+ }
103
+ this . _events [ event ] . push ( cb ) ;
104
+ this . _regexs [ event ] = this . eventRegex ( event ) ;
105
+ this . emit ( "newListener" , event , cb ) ;
106
+
107
+ return this ;
108
+ }
109
+
110
+ EventEmitter . prototype . once =
111
+ EventEmitter . prototype . addOnceListener =
112
+ function ( event , cb ) {
113
+ var self = this ;
114
+ var func = function ( ) {
115
+ self . execListener ( cb , arguments ) ;
116
+ self . off ( event , cb ) ;
117
+ }
118
+ this . on ( event , func ) ;
119
+
120
+
121
+ return this ;
122
+ }
123
+
124
+ EventEmitter . prototype . many =
125
+ EventEmitter . prototype . addManyListener =
126
+ function ( event , cb , amount ) {
127
+ var self = this ;
128
+ var count = 0 ;
129
+ var func = function ( ) {
130
+ self . execListener ( cb , arguments ) ;
131
+ count ++ ;
132
+ if ( count === amount ) {
133
+ self . off ( event , this ) ;
134
+ }
135
+ }
136
+ this . on ( event , func ) ;
137
+
138
+ return this ;
139
+ }
140
+
141
+ EventEmitter . prototype . off =
142
+ EventEmitter . prototype . removeListener =
143
+ EventEmitter . prototype . removeEventListener =
144
+ function ( event , cb , all ) {
145
+ if ( all ) {
146
+ for ( var ev in this . _events ) {
147
+ var regex = this . _regexs [ ev ] ;
148
+ if ( regex . test ( event ) ) {
149
+ var listeners = this . _events [ ev ] ;
150
+ var result = [ ] ;
151
+ for ( var i = 0 , len = listeners . length ; i < len ; i ++ ) {
152
+ if ( listeners [ i ] !== cb ) {
153
+ result . push ( listeners [ i ] ) ;
154
+ }
155
+ }
156
+ this . _events [ ev ] = result ;
157
+ }
158
+ }
159
+ }
160
+ else {
161
+ for ( var ev in this . _events ) {
162
+ var regex = this . _regexs [ ev ] ;
163
+ if ( regex . test ( event ) ) {
164
+ var index = listeners . indexOf ( cb ) ;
165
+ if ( index > - 1 ) {
166
+ this . _events [ ev ] . splice ( index , 1 ) ;
167
+ }
168
+ }
169
+ }
170
+ }
171
+
172
+ return this ;
173
+ }
174
+
175
+ EventEmitter . prototype . offAll =
176
+ EventEmitter . prototype . removeAllListeners =
177
+ function ( event ) {
178
+ if ( event ) {
179
+ for ( var ev in this . _events ) {
180
+ var regex = this . _regexs [ ev ] ;
181
+ if ( regex . test ( event ) ) {
182
+ this . _events [ ev ] = [ ] ;
183
+ }
184
+ }
185
+ }
186
+ else {
187
+ this . _events = { } ;
188
+ }
189
+
190
+ return this ;
191
+ }
192
+
193
+ EventEmitter . prototype . count =
194
+ EventEmitter . prototype . countListeners =
195
+ function ( event ) {
196
+ var sum = 0 ;
197
+
198
+ if ( event ) {
199
+ for ( var ev in this . _events ) {
200
+ var regex = this . _regexs [ ev ] ;
201
+ if ( regex . test ( event ) ) {
202
+ sum += this . _events [ ev ] . length ;
203
+ }
204
+ }
205
+ }
206
+ else {
207
+ for ( var ev in this . _events ) {
208
+ sum += this . _events [ ev ] . length ;
209
+ }
210
+ }
211
+
212
+ return sum ;
213
+ }
214
+
215
+ EventEmitter . prototype . listeners =
216
+ EventEmitter . prototype . getListeners =
217
+ function ( event ) {
218
+ var listeners = [ ] ;
219
+
220
+ if ( event ) {
221
+ for ( var ev in this . _events ) {
222
+ var regex = this . _regexs [ ev ] ;
223
+ if ( regex . test ( event ) ) {
224
+ listeners . push . apply ( listeners , this . _events [ ev ] ) ;
225
+ }
226
+ }
227
+ }
228
+ else {
229
+ var listeners = [ ] ;
230
+ for ( var ev in this . _events ) {
231
+ listeners . push . apply ( listeners , this . _events [ ev ] ) ;
232
+ }
233
+ }
234
+
235
+ return listeners ;
236
+ }
237
+
238
+
239
+
240
+
241
+
242
+
243
+ /**
244
+ * Namespace
245
+ *
246
+ * Create a namespace / scope on EventEmitters
247
+ */
248
+
249
+ var Namespace = function ( emitter , scope ) {
250
+ var namespace = {
251
+ emitter : emitter ,
252
+ scope : scope ,
253
+ execListener : emitter . execListener ,
254
+ eventRegex : emitter . eventRegex
255
+ } ;
256
+ scope += ":" ;
257
+
258
+
259
+ namespace . emit = function ( event ) {
260
+ arguments [ 0 ] = scope + event ;
261
+ emitter . emit . apply ( emitter , arguments ) ;
262
+ return this ;
263
+ }
264
+
265
+ namespace . on = namespace . addListener = namespace . addEventListener = function ( event , cb ) {
266
+ emitter . addListener ( scope + event , cb ) ;
267
+ return this ;
268
+ }
269
+
270
+ namespace . once = namespace . addOnceListener = function ( event , cb ) {
271
+ emitter . addOnceListener ( scope + event , cb ) ;
272
+ return this ;
273
+ }
274
+
275
+ namespace . many = namespace . addManyListener = function ( event , cb ) {
276
+ emitter . addManyListener ( scope + event , cb ) ;
277
+ return this ;
278
+ }
279
+
280
+ namespace . off = namespace . removeListener = namespace . removeEventListener = function ( event , cb ) {
281
+ emitter . removeListener ( scope + event , cb ) ;
282
+ return this ;
283
+ }
284
+
285
+ namespace . offAll = namespace . removeAllListeners = function ( event ) {
286
+ emitter . removeAllListeners ( scope + ( event ? event : "*" ) ) ;
287
+
288
+ return this ;
289
+ }
290
+
291
+ namespace . count = namespace . countListeners = function ( event ) {
292
+ emitter . countListeners ( scope + ( event ? event : "*" ) ) ;
293
+
294
+ return this ;
295
+ }
296
+
297
+ namespace . listeners = namespace . getListeners = function ( event ) {
298
+ emitter . getListeners ( scope + ( event ? event : "*" ) ) ;
299
+
300
+ return this ;
301
+ }
302
+
303
+ namespace . namespace = function ( name ) {
304
+ return Namespace ( scope + name , emitter ) ;
305
+ }
306
+
307
+
308
+ return namespace ;
309
+ }
310
+
311
+
312
+ EventEmitter . prototype . namespace = function ( scope ) {
313
+ return Namespace ( this , scope ) ;
314
+ }
315
+
316
+
317
+
318
+
319
+
320
+ return EventEmitter ;
321
+
322
+
323
+ } ) ) ;
0 commit comments