1 | import EventEmitter from 'eventemitter3';
|
2 | import logger from './logger';
|
3 |
|
4 | let debug = logger('quill:events');
|
5 |
|
6 | const EVENTS = ['selectionchange', 'mousedown', 'mouseup'];
|
7 |
|
8 | EVENTS.forEach(function(eventName) {
|
9 | document.addEventListener(eventName, (...args) => {
|
10 | [].slice.call(document.querySelectorAll('.ql-container')).forEach((node) => {
|
11 |
|
12 | if (node.__quill && node.__quill.emitter) {
|
13 | node.__quill.emitter.handleDOM(...args);
|
14 | }
|
15 | });
|
16 | });
|
17 | });
|
18 |
|
19 |
|
20 | class Emitter extends EventEmitter {
|
21 | constructor() {
|
22 | super();
|
23 | this.listeners = {};
|
24 | this.on('error', debug.error);
|
25 | }
|
26 |
|
27 | emit() {
|
28 | debug.log.apply(debug, arguments);
|
29 | super.emit.apply(this, arguments);
|
30 | }
|
31 |
|
32 | handleDOM(event, ...args) {
|
33 | (this.listeners[event.type] || []).forEach(function({ node, handler }) {
|
34 | if (event.target === node || node.contains(event.target)) {
|
35 | handler(event, ...args);
|
36 | }
|
37 | });
|
38 | }
|
39 |
|
40 | listenDOM(eventName, node, handler) {
|
41 | if (!this.listeners[eventName]) {
|
42 | this.listeners[eventName] = [];
|
43 | }
|
44 | this.listeners[eventName].push({ node, handler })
|
45 | }
|
46 | }
|
47 |
|
48 | Emitter.events = {
|
49 | EDITOR_CHANGE : 'editor-change',
|
50 | SCROLL_BEFORE_UPDATE : 'scroll-before-update',
|
51 | SCROLL_OPTIMIZE : 'scroll-optimize',
|
52 | SCROLL_UPDATE : 'scroll-update',
|
53 | SELECTION_CHANGE : 'selection-change',
|
54 | TEXT_CHANGE : 'text-change'
|
55 | };
|
56 | Emitter.sources = {
|
57 | API : 'api',
|
58 | SILENT : 'silent',
|
59 | USER : 'user'
|
60 | };
|
61 |
|
62 |
|
63 | export default Emitter;
|