事件绑定
//通用的绑定函数
function bindEvent(elem,type,fn){
elem.addEventListener(type,fn)
}
// 普通绑定
const btn1 = document.getElementById('btn1')
bindEvent(btn1, 'click', function (event) {
// console.log(event.target) // 获取触发的元素
event.preventDefault() // 阻止默认行为,比如禁止链接跳转
alert(this.innerHTML)
})
事件冒泡
事件代理
- 是什么:基于事件冒泡实现的事件绑定,将子元素触发的事件交给父元素的事件处理函数处理
- 作用:多个元素需要同事件同事件处理函数。//不要滥用
- 优点:代码简洁;减少浏览器内存占用(因为dom事件是由web apis管理的,触发时将事件添加到回调栈中执行)
通过冒泡机制,在祖先元素上绑定事件,然后通过e.target 来判断是哪个元素触发的事件
我们将事件绑定函数进化一下,使监听函数中的逻辑变得简单些,并且可以使其既支持普通绑定又支持代理绑定。则绑定代码如下:
function bindEvent(elem, type, selector, fn) {
if (fn == null) {
fn = selector
selector = null
}//普通绑定传入三个参数,第三个参数selector此时是回调函数
elem.addEventListener(type, event => {
const target = event.target
if (selector) {
// 代理绑定
if (target.matches(selector)) {//matchs是判断一个css元素是否符合selector选择器。如上述HTML代码,点击a标签符合,点击button不符合。因为我们传入的是a标签。
fn.call(target, event)
}
} else {
// 普通绑定
fn.call(target, event)
}
})
}
const div3 = document.getElementById('div3')
bindEvent(div3, 'click', 'a', function (event) {
event.preventDefault()
alert(this.innerHTML)
})