事件委托 例子

Q:你要给100 个按钮添加点击事件,怎么办? A:监听这100个按钮的 祖先,等冒泡的时候判断 target 是不是这100个按钮中的一个。

优点

  • 省内存
  • 可以监听动态元素

封装事件委托

用函数 on(‘click’,'#testDiv’, ‘span’,fn)

<div id='testDiv'>
    <span>哈哈</span>
</div>

用户点击“哈哈”,调用函数fn

 function on (eventType, element,  selector, fn) {
     if(!(element instanceOf Element)){
        element=document.querySelector(element)
     }
    element.addEventListener(eventType, e => {
      let el = e.target
      while (!el.matches(selector)) {
        if (element === el) {
          el = null
          break
        }
        el = el.parentNode
      }
      el && fn.call(el, e, el)
    })
    return element
  },