实现一个通用事件绑定函数(可以支持事件代理)
function bindEvent(elem, type, selector, fn) {
if(fn == null) { //如果没传selector,则默认第三个参数为fn
fn = selector
selector = null
}
elem.addEventListener(type, event => {
const target = event.target
if(selector) { // 如果传入了selector,则说明是事件代理模式
if(target.matches(selector)) {
fn.call(target, event)
}else { // 否则是普通绑定模式
fn.call(target, event)
}
}
})
}
举例:
<div>
<a class="a1">1</a>
<a>2</a>
<a>3</a>
<button>4</button>
</div>
<script>
// 普通监听
const a1 = document,querySelector('.a1')
bindEvent(a1, 'click', function(event) {
event.preventDefault()
console.log(this.innerHTML) // 1
})
// 事件代理
const div = document.querySelector('div')
bindEvent(div, 'click', 'a', function(event) {
event.preventDefault()
console.log(this.innerHTML) // 结果依次为 1 2 3 (button没有被监听)
})
</script>
若没有本文 Issue,您可以使用 Comment 模版新建。
GitHub Issues