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 {
constructor () {
this.events = []
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 () {
// TODO
}
getHtml () {
// TODO
}
destroy () {
// TODO
// destroy the event bind.
}
}