From e4a1ef85b28c6380e14a7d4d4eb92868f39042f0 Mon Sep 17 00:00:00 2001 From: BeAce Date: Thu, 15 Nov 2018 11:52:58 +0800 Subject: [PATCH 1/2] add handleEvent --- lib/index.js | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/index.js b/lib/index.js index 8d2deb0..f90d884 100644 --- a/lib/index.js +++ b/lib/index.js @@ -3,16 +3,40 @@ class Delegator { constructor (selector/* root选择器 */) { // TODO + this.root = doc.querySelector(selector); + this.eventCollection = {}; + // Using `bind this` not `arrow function` for prevent creating multiple functions + // Also prevent trigger multiple click + this.handleEvent = this.handleEvent.bind(this); } - on (event/* 绑定事件 */, selector/* 触发事件节点对应选择器 */, fn/* 出发函数 */) { + handleEvent(e) { + const eventPath = e.path; + const type = this.eventCollection[e.type]; + if (!type) return; + for (let i = 0; i < eventPath.length; i++) { + if (eventPath[i] === e.currentTarget) return; + this.eventCollection[e.type][eventPath[i]] && this.eventCollection[e.type][eventPath[i]].call(eventPath[i], e); + } + } + + on (event/* 绑定事件 */, selector/* 触发事件节点对应选择器 */, fn/* 触发函数 */) { // TODO + if (!this.eventCollection[event]) { + this.eventCollection[event] = {}; + } + + // It may not be a good way, saved a big element as key and used querySelector. + Object.assign(this.eventCollection[event], { [doc.querySelector(selector)]: fn }); + this.root.addEventListener(event, this.handleEvent); + return this; } destroy () { // TODO + this.eventCollection = {}; } } root.Delegator = Delegator -}(window, document) \ No newline at end of file +}(window, document) From 02dc73012a9eefd12afb387510186ecb8fb6198c Mon Sep 17 00:00:00 2001 From: BeAce Date: Thu, 15 Nov 2018 13:30:14 +0800 Subject: [PATCH 2/2] remove events --- lib/index.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/index.js b/lib/index.js index f90d884..44dca7d 100644 --- a/lib/index.js +++ b/lib/index.js @@ -16,7 +16,7 @@ if (!type) return; for (let i = 0; i < eventPath.length; i++) { if (eventPath[i] === e.currentTarget) return; - this.eventCollection[e.type][eventPath[i]] && this.eventCollection[e.type][eventPath[i]].call(eventPath[i], e); + type[eventPath[i]] && type[eventPath[i]].call(eventPath[i], e); } } @@ -34,6 +34,9 @@ destroy () { // TODO + Object.keys(this.eventCollection).forEach(event => { + this.root.removeEventListener(event, this.handleEvent); + }) this.eventCollection = {}; } }