event.js done

This commit is contained in:
Jocs 2017-11-15 22:11:18 +08:00
parent e27282ce9a
commit 40ae1cf650
2 changed files with 72 additions and 14 deletions

View File

@ -1,23 +1,77 @@
import {
getUniqueId
} from './utils'
class Event { class Event {
constructor () { constructor () {
this.events = [] this.events = []
this.listeners = {} this.listeners = {}
this.eventIds = new Set([]) // use to store eventId
} }
/**
attachDOMEvent () { * [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(this.eventIds)
target.addEventListener(event, listener, capture)
this.events.push({
eventId,
target,
event,
listener,
capture
})
return eventId
} }
/**
detachDOMEvent () { * [detachDOMEvent removeEventListener]
* @param {[type]} eventId [unique eventId]
*/
detachDOMEvent (eventId) {
if (!eventId) return false
const removeEvent = this.events.filter(e => e.eventId === eventId)[0]
if (removeEvent) {
const { target, event, listener, capture } = removeEvent
target.removeEventListener(event, listener, capture)
}
} }
/**
subscribe () { * [detachAllDomEvents remove all the DOM events handler]
*/
detachAllDomEvents () {
this.events.forEach(event => this.detachDOMEvent(event.eventId))
} }
/**
dispatch () { * [subscribe] subscribe custom event
*/
subscribe (event, listener) {
const eventListener = this.listeners[event]
if (eventListener && Array.isArray(eventListener)) {
eventListener.push(listener)
} else {
this.listeners[event] = [listener]
}
}
// dispatch custom event
dispatch (event, ...data) {
const eventListener = this.listeners[event]
if (eventListener && Array.isArray(eventListener)) {
eventListener.forEach(listener => listener(...data))
}
}
// Determine whether the event has been bind
checkHasBind(cTarget, cEvent, cListener, cCapture) {
let i
let len = this.events.length
for (i = 0; i < len; i++) {
const { target, event, listener, capture } = this.events[i]
if (target === cTarget && event === cEvent && listener === cListener && capture === cCapture) {
return true
}
}
return false
} }
} }

View File

@ -104,10 +104,14 @@ class Aganippe {
} }
getMarkdown () { getMarkdown () {
// TODO
} }
getHtml () { getHtml () {
// TODO
}
destroy () {
// TODO
// destroy the event bind.
} }
} }