forked from marktext/marktext
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathevent.js
More file actions
112 lines (101 loc) · 2.75 KB
/
event.js
File metadata and controls
112 lines (101 loc) · 2.75 KB
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
import { getUniqueId } from '../utils'
class EventCenter {
constructor () {
this.events = []
this.listeners = {}
}
/**
* [attachDOMEvent] bind event listener to target, and return a unique ID,
* this ID
*/
attachDOMEvent (target, event, listener, capture) {
if (this.checkHasBind(target, event, listener, capture)) return false
const eventId = getUniqueId()
target.addEventListener(event, listener, capture)
this.events.push({
eventId,
target,
event,
listener,
capture
})
return eventId
}
/**
* [detachDOMEvent removeEventListener]
* @param {[type]} eventId [unique eventId]
*/
detachDOMEvent (eventId) {
if (!eventId) return false
const index = this.events.findIndex(e => e.eventId === eventId)
if (index > -1) {
const { target, event, listener, capture } = this.events[index]
target.removeEventListener(event, listener, capture)
this.events.splice(index, 1)
}
}
/**
* [detachAllDomEvents remove all the DOM events handler]
*/
detachAllDomEvents () {
this.events.forEach(event => this.detachDOMEvent(event.eventId))
}
/**
* inner method for subscribe and subscribeOnce
*/
_subscribe (event, listener, once = false) {
const listeners = this.listeners[event]
const handler = { listener, once }
if (listeners && Array.isArray(listeners)) {
listeners.push(handler)
} else {
this.listeners[event] = [handler]
}
}
/**
* [subscribe] subscribe custom event
*/
subscribe (event, listener) {
this._subscribe(event, listener)
}
/**
* [unsubscribe] unsubscribe custom event
*/
unsubscribe (event, listener) {
const listeners = this.listeners[event]
if (Array.isArray(listeners) && listeners.find(l => l.listener === listener)) {
const index = listeners.findIndex(l => l.listener === listener)
listeners.splice(index, 1)
}
}
/**
* [subscribeOnce] usbscribe event and listen once
*/
subscribeOnce (event, listener) {
this._subscribe(event, listener, true)
}
/**
* dispatch custom event
*/
dispatch (event, ...data) {
const eventListener = this.listeners[event]
if (eventListener && Array.isArray(eventListener)) {
eventListener.forEach(({ listener, once }) => {
listener(...data)
if (once) {
this.unsubscribe(event, listener)
}
})
}
}
// Determine whether the event has been bind
checkHasBind (cTarget, cEvent, cListener, cCapture) {
for (const { target, event, listener, capture } of this.events) {
if (target === cTarget && event === cEvent && listener === cListener && capture === cCapture) {
return true
}
}
return false
}
}
export default EventCenter