UNPKG

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