diff --git a/lib/index.js b/lib/index.js index 8d2deb0..870c36b 100644 --- a/lib/index.js +++ b/lib/index.js @@ -3,14 +3,53 @@ class Delegator { constructor (selector/* root选择器 */) { // TODO + this.root = doc.querySelector(selector); + this.delegatedListeners = {}; + } + + delegator (eventNm) { + return (e, ...args) => { + var event = e || window.event; + // console.log(e); + var i = 0, len = event.path.length; + while (i < len) { + var target = event.path[i]; + this.delegatedListeners[eventNm].listeners.forEach(item => { + if (target.matches(item.selector)) { + item.fn.call(target, e, ...args); + } + }) + if (target === this.root) return + i++; + } + } } on (event/* 绑定事件 */, selector/* 触发事件节点对应选择器 */, fn/* 出发函数 */) { - // TODO + // 字符串处理selector + selector = selector.replace(/^\s+(.*?)\s+$/g, '$1'); + + if (!this.delegatedListeners[event]) { + let delegator = this.delegator(event); + this.delegatedListeners[event] = { + delegator, + listeners: [] + } + this.root.addEventListener(event, delegator); + }; + this.delegatedListeners[event].listeners.push({ + selector, + fn + }) + + return this } destroy () { // TODO + Object.keys(this.delegatedListeners).forEach(eventNm => { + this.root.removeEventListener(eventNm, this.delegatedListeners[eventNm].delegator); + }) } } diff --git a/lib/polyfill.js b/lib/polyfill.js new file mode 100644 index 0000000..3cc5a48 --- /dev/null +++ b/lib/polyfill.js @@ -0,0 +1,14 @@ +if (!Element.prototype.matches) { + Element.prototype.matches = + Element.prototype.matchesSelector || + Element.prototype.mozMatchesSelector || + Element.prototype.msMatchesSelector || + Element.prototype.oMatchesSelector || + Element.prototype.webkitMatchesSelector || + function(s) { + var matches = (this.document || this.ownerDocument).querySelectorAll(s), + i = matches.length; + while (--i >= 0 && matches.item(i) !== this) {} + return i > -1; + }; +} \ No newline at end of file