UNPKG

2.75 kBJavaScriptView Raw
1function invokeHandler(handler, vnode, event) {
2 if (typeof handler === "function") {
3 // call function handler
4 handler.call(vnode, event, vnode);
5 }
6 else if (typeof handler === "object") {
7 // call multiple handlers
8 for (let i = 0; i < handler.length; i++) {
9 invokeHandler(handler[i], vnode, event);
10 }
11 }
12}
13function handleEvent(event, vnode) {
14 const name = event.type;
15 const on = vnode.data.on;
16 // call event handler(s) if exists
17 if (on && on[name]) {
18 invokeHandler(on[name], vnode, event);
19 }
20}
21function createListener() {
22 return function handler(event) {
23 handleEvent(event, handler.vnode);
24 };
25}
26function updateEventListeners(oldVnode, vnode) {
27 const oldOn = oldVnode.data.on;
28 const oldListener = oldVnode.listener;
29 const oldElm = oldVnode.elm;
30 const on = vnode && vnode.data.on;
31 const elm = (vnode && vnode.elm);
32 let name;
33 // optimization for reused immutable handlers
34 if (oldOn === on) {
35 return;
36 }
37 // remove existing listeners which no longer used
38 if (oldOn && oldListener) {
39 // if element changed or deleted we remove all existing listeners unconditionally
40 if (!on) {
41 for (name in oldOn) {
42 // remove listener if element was changed or existing listeners removed
43 oldElm.removeEventListener(name, oldListener, false);
44 }
45 }
46 else {
47 for (name in oldOn) {
48 // remove listener if existing listener removed
49 if (!on[name]) {
50 oldElm.removeEventListener(name, oldListener, false);
51 }
52 }
53 }
54 }
55 // add new listeners which has not already attached
56 if (on) {
57 // reuse existing listener or create new
58 const listener = (vnode.listener =
59 oldVnode.listener || createListener());
60 // update vnode for listener
61 listener.vnode = vnode;
62 // if element changed or added we add all needed listeners unconditionally
63 if (!oldOn) {
64 for (name in on) {
65 // add listener if element was changed or new listeners added
66 elm.addEventListener(name, listener, false);
67 }
68 }
69 else {
70 for (name in on) {
71 // add listener if new listener added
72 if (!oldOn[name]) {
73 elm.addEventListener(name, listener, false);
74 }
75 }
76 }
77 }
78}
79export const eventListenersModule = {
80 create: updateEventListeners,
81 update: updateEventListeners,
82 destroy: updateEventListeners,
83};
84//# sourceMappingURL=eventlisteners.js.map
\No newline at end of file