From d16a738b56d31cea63ed6b9b38f0e6ce183672d7 Mon Sep 17 00:00:00 2001 From: Gong Lixian Date: Fri, 16 Nov 2018 07:30:53 +0800 Subject: [PATCH] :tada: (delegator): pass all tests --- lib/index.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lib/index.js b/lib/index.js index 8d2deb0..15db6a4 100644 --- a/lib/index.js +++ b/lib/index.js @@ -3,14 +3,44 @@ class Delegator { constructor (selector/* root选择器 */) { // TODO + this.root = document.querySelector(selector); + this.delegatorEventList = {}; + this.delegator = e => { + let currentNode = e.target; + const targetEventList = this.delegatorEventList[e.type]; + while (currentNode !== e.currentTarget) { + targetEventList.forEach(target => { + if (currentNode.matches(target.matcher)) { + target.callback.call(currentNode, e); + } + }) + currentNode = currentNode.parentNode; + } + } } on (event/* 绑定事件 */, selector/* 触发事件节点对应选择器 */, fn/* 出发函数 */) { // TODO + if (!this.delegatorEventList[event]) { + this.delegatorEventList[event] = [{ + matcher: selector, + callback: fn + }] + this.root.addEventListener(event, this.delegator); + } else { + this.delegatorEventList[event].push({ + matcher: selector, + callback: fn + }) + } + return this; } destroy () { // TODO + Object.keys(this.delegatorEventList).map(eventName => { + this.root.removeEventListener(eventName, this.delegator) + }); } }