diff --git a/src/editor/event.js b/src/editor/event.js index f943e4d0..7ff83db5 100644 --- a/src/editor/event.js +++ b/src/editor/event.js @@ -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 } } diff --git a/src/editor/index.js b/src/editor/index.js index e4b6498f..92b68d85 100644 --- a/src/editor/index.js +++ b/src/editor/index.js @@ -104,10 +104,14 @@ class Aganippe { } getMarkdown () { - + // TODO } getHtml () { - + // TODO + } + destroy () { + // TODO + // destroy the event bind. } }