DOM事件机制-事件委托

99 阅读1分钟

事件委托,又称之为事件代理。是JavaScript中常用绑定事件的常用技巧。

顾名思义,“事件委托”即是把原本需要绑定在子元素的响应事件(click、keydown......)委托给父元素,让父元素担当事件监听的职务。
DOM事件处理时,会冒泡传递,所有子元素的响应事件,最后终将传递给父元素,那么,开发者就不再监听子元素的响应事件,而直接在父元素上监听,处理响应事件,这种模式就是事件委托,事件代理,父元素代理子元素的响应事件。

事件委托模式的基础有两个

  • 事件冒泡排序
  • 事件有target属性和currentTarget属性,target可以得到获取事件的元素,currentTarget能得到监听事件的元素
<div id="x">
    <div id="div1" style="border: 1px solid red">1</div>
</div>

在元素div1前面增加一个 button,然后给他增加点击事件

setTimeout(() => {
    const b = document.createElement('button');
    b.textContent = 'click';
    div1.parentNode.insertBefore(b, div1);
}, 1000);
x.addEventListener('click', e => {
    let el = e.target
    while (!el.matches('button')) {
        if (element === el) {
            el = null
            break
        }
        el = el.parentNode
    }
    el && console.log("button 被点击了");
})

程序的运行结果:

button 被点击了

虽然只给父元素div1添加了点击事件,但是,因为button的点击事件可以冒泡传递给div1,所以div1的点击事件中,可以处理button的点击事件,相当于button的点击事件委托给父亲处理了,这就是事件委托