DOM事件委托

176 阅读1分钟

DOM事件委托,通俗的说就是:委托一个元素帮我监听我本来监听的事件,一般来讲,会把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定事件的是外层元素,当事件响应到需要绑定的元素上时,会通过事件冒泡机制从而触发它的外层元素的绑定事件上,然后在外层元素上去执行函数。

事件委托的优点:

  1. 省监听数(省内存)

  2. 可以监听动态元素

示例一:你要给 100 个按钮添加点击事件,咋办? 答:监听这 100 个按钮的祖先,等冒泡的时候判断 target 是不是这 100 个按钮中的一个

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <div id=div1> 
    <button data-id='1'>click 1</button>
    <button>click 2</button>
    <button>click 3</button>
    <button>click 4</button>
    ...
    <button data-id='100'>click 100</button>
  </div>
</body>
</html>
div1.addEventListener('click',(e)=>{
    const t = e.target
    if(t.tagName.toLowerCase()==='botton'){
        console.log('button 被点击了')
        console.log('button内容是'+t.textContent)
        console.log('button data-id 是'+t.dataset.id)
    }
})

示例二:你要监听目前不存在的元素的点击事件,咋办? 答:监听祖先,等点击的时候看看是不是我想要监听的元素即可

...
<div id=div1> 

</div>
...
setTimeout(()=>{
    const button = document.createElement('botton')
    button.textContent = 'click 1'
    div1.appendChild(button)
},1000)

div1.addEventListener('click',(e)=>{
    const t = e.target
    if(t.tagName.toLowerCase()==='button'){
        console.log("button 被 click")
    }
})

封装事件委托:

  • 别人只需要用on事件,就能做到在div1上做事件委托,来看button是否被点击。
on('click','#div1','button',()=>{
    console.log('button 被点击了')
})

先搞清楚输入,输入时4个参数:

  • 事件类型eventType,比如onlick事件;
  • 元素element;
  • 选择器seletor,准备匹配什么元素;
  • 回调函数fn,比如点击时被调用; 再搞清楚输出, 以下代码即为封装好的事件委托函数:
function on(eventType,element,selector,fn){.
   if(!(element instanceof Element)){
     element = document.querySelector(element)
   }
    element.addEventListener(eventType,()=>{
        const t = e.target
        if(t.matches(seletor)){
            fn(e)
        }
    })
}