UNPKG

2.92 kBJavaScriptView Raw
1/* eslint-disable no-underscore-dangle */
2export default {
3 on(events, handler, priority) {
4 const self = this;
5 if (typeof handler !== 'function') return self;
6 const method = priority ? 'unshift' : 'push';
7 events.split(' ').forEach(event => {
8 if (!self.eventsListeners[event]) self.eventsListeners[event] = [];
9 self.eventsListeners[event][method](handler);
10 });
11 return self;
12 },
13
14 once(events, handler, priority) {
15 const self = this;
16 if (typeof handler !== 'function') return self;
17
18 function onceHandler(...args) {
19 self.off(events, onceHandler);
20
21 if (onceHandler.__emitterProxy) {
22 delete onceHandler.__emitterProxy;
23 }
24
25 handler.apply(self, args);
26 }
27
28 onceHandler.__emitterProxy = handler;
29 return self.on(events, onceHandler, priority);
30 },
31
32 onAny(handler, priority) {
33 const self = this;
34 if (typeof handler !== 'function') return self;
35 const method = priority ? 'unshift' : 'push';
36
37 if (self.eventsAnyListeners.indexOf(handler) < 0) {
38 self.eventsAnyListeners[method](handler);
39 }
40
41 return self;
42 },
43
44 offAny(handler) {
45 const self = this;
46 if (!self.eventsAnyListeners) return self;
47 const index = self.eventsAnyListeners.indexOf(handler);
48
49 if (index >= 0) {
50 self.eventsAnyListeners.splice(index, 1);
51 }
52
53 return self;
54 },
55
56 off(events, handler) {
57 const self = this;
58 if (!self.eventsListeners) return self;
59 events.split(' ').forEach(event => {
60 if (typeof handler === 'undefined') {
61 self.eventsListeners[event] = [];
62 } else if (self.eventsListeners[event]) {
63 self.eventsListeners[event].forEach((eventHandler, index) => {
64 if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {
65 self.eventsListeners[event].splice(index, 1);
66 }
67 });
68 }
69 });
70 return self;
71 },
72
73 emit(...args) {
74 const self = this;
75 if (!self.eventsListeners) return self;
76 let events;
77 let data;
78 let context;
79
80 if (typeof args[0] === 'string' || Array.isArray(args[0])) {
81 events = args[0];
82 data = args.slice(1, args.length);
83 context = self;
84 } else {
85 events = args[0].events;
86 data = args[0].data;
87 context = args[0].context || self;
88 }
89
90 data.unshift(context);
91 const eventsArray = Array.isArray(events) ? events : events.split(' ');
92 eventsArray.forEach(event => {
93 if (self.eventsAnyListeners && self.eventsAnyListeners.length) {
94 self.eventsAnyListeners.forEach(eventHandler => {
95 eventHandler.apply(context, [event, ...data]);
96 });
97 }
98
99 if (self.eventsListeners && self.eventsListeners[event]) {
100 self.eventsListeners[event].forEach(eventHandler => {
101 eventHandler.apply(context, data);
102 });
103 }
104 });
105 return self;
106 }
107
108};
\No newline at end of file