1 | function invokeHandler(handler, vnode, event) {
|
2 | if (typeof handler === "function") {
|
3 |
|
4 | handler.call(vnode, event, vnode);
|
5 | }
|
6 | else if (typeof handler === "object") {
|
7 |
|
8 | for (let i = 0; i < handler.length; i++) {
|
9 | invokeHandler(handler[i], vnode, event);
|
10 | }
|
11 | }
|
12 | }
|
13 | function handleEvent(event, vnode) {
|
14 | const name = event.type;
|
15 | const on = vnode.data.on;
|
16 |
|
17 | if (on && on[name]) {
|
18 | invokeHandler(on[name], vnode, event);
|
19 | }
|
20 | }
|
21 | function createListener() {
|
22 | return function handler(event) {
|
23 | handleEvent(event, handler.vnode);
|
24 | };
|
25 | }
|
26 | function 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 |
|
34 | if (oldOn === on) {
|
35 | return;
|
36 | }
|
37 |
|
38 | if (oldOn && oldListener) {
|
39 |
|
40 | if (!on) {
|
41 | for (name in oldOn) {
|
42 |
|
43 | oldElm.removeEventListener(name, oldListener, false);
|
44 | }
|
45 | }
|
46 | else {
|
47 | for (name in oldOn) {
|
48 |
|
49 | if (!on[name]) {
|
50 | oldElm.removeEventListener(name, oldListener, false);
|
51 | }
|
52 | }
|
53 | }
|
54 | }
|
55 |
|
56 | if (on) {
|
57 |
|
58 | const listener = (vnode.listener =
|
59 | oldVnode.listener || createListener());
|
60 |
|
61 | listener.vnode = vnode;
|
62 |
|
63 | if (!oldOn) {
|
64 | for (name in on) {
|
65 |
|
66 | elm.addEventListener(name, listener, false);
|
67 | }
|
68 | }
|
69 | else {
|
70 | for (name in on) {
|
71 |
|
72 | if (!oldOn[name]) {
|
73 | elm.addEventListener(name, listener, false);
|
74 | }
|
75 | }
|
76 | }
|
77 | }
|
78 | }
|
79 | export const eventListenersModule = {
|
80 | create: updateEventListeners,
|
81 | update: updateEventListeners,
|
82 | destroy: updateEventListeners,
|
83 | };
|
84 |
|
\ | No newline at end of file |