Skip to content

Commit fc53498

Browse files
committed
First commit
0 parents  commit fc53498

File tree

4 files changed

+364
-0
lines changed

4 files changed

+364
-0
lines changed

EventEmitter.js

+323
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,323 @@
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+
}));

LICENSE

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
The MIT License (MIT)
2+
3+
Copyright (c) 2014-2015 Tuur Dutoit
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in
13+
all copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21+
THE SOFTWARE.

README.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
EventEmitter
2+
============
3+
4+
For once and for all: a small, fast and full-featured EventEmitter, for node.js and the browser.
5+
6+
EventEmitter supports, apart from the usual stuff, `handleEvent()` objects, wildcards and namespaces. And all this is ~300 lines of code.

test.html

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
6+
<meta name="viewport" content="width=device-width, initial-scale=1" />
7+
<meta name="description" content="" />
8+
<meta name="keywords" content="" />
9+
<title></title>
10+
</head>
11+
<body>
12+
<script type="text/javascript" src="EventEmitter.js"></script>
13+
</body>
14+
</html>

0 commit comments

Comments
 (0)