封裝一個通用的事件監(jiān)聽函數(shù),可實現(xiàn)普通的事件監(jiān)聽,也可實現(xiàn)事件委托(事件代理)
function bindEvent(el, type, selector, fn) {
// 如果第四個參數(shù)不存在,則第三個參數(shù)就是fn
if (!fn) {
fn = selector
selector = ''
}
// 普通的事件監(jiān)聽
if (!selector) {
el.addEventListener(type, fn)
return
}
// 事件委托
el.addEventListener(type, event => {
let element = event.target
// 點擊的元素是否匹配期望的選擇器
while (!element.matches(selector)) {
if (element === el) {
element = null
break
}
element = element.parentNode
}
element && fn.call(element, event, element)
})
}
var beginButton = document.querySelector('.begin')
var body = document.body
// 普通點擊事件
bindEvent(beginButton, 'click', e => {
e.stopPropagation()
console.log(e.currentTarget)
})
// 事件委托
bindEvent(body, 'click', '.stop', e => {
console.log(e.target)
console.log(e.currentTarget)
})