JS基础总结 - 事件委托和事件绑定函数

1. 事件绑定


1.1 示例:

const div1 = document.getElementById('div1')
div1.addEventListener('click', e => {
  console.log('clicked')
})

1.2 事件绑定函数

在实际开发中,经常需要为元素绑定事件。因此可以将事件绑定的代码封装成一个通用的事件绑定函数。(如下 ↓)

// 事件绑定函数1.0版 (不支持事件代理)
function bindEvent(elem, type, fn) {
  elem.addEventListener(type, fn)
}

// 测试
const btn = document.getElementById('btn1')
bindEvent(btn, 'click', e => {
  // console.log(e.target) // 获取触发的元素
  // e.preventDefault() // 阻止默认行为
  // e.stopPropagation() // 阻止事件冒泡
  console.log('clicked')
})


2. 事件委托 / 代理

利用事件的冒泡机制,我们可以在父级元素上绑定事件,从而监听子元素上冒泡上来的事件。


2.1 示例

const div1 = document.getElementById('div1')
div1.addEventListener('click', e => {
  const target = e.target
  if (target.nodeName === 'A') {
    console.log(target.innerHTML)
  }
})

2.2 事件委托的优点

  • 代码更简洁。
  • 性能更好。只绑定一次事件,减少内存的使用。

2.3 改写事件绑定函数(兼容事件委托)

// 事件绑定函数2.0 (支持事件代理)
function bindEvent(elem, type, selector, fn) {
  if (fn == null) {
    fn = selector
    selector = null
  }
  elem.addEventListener(type, e => {
    const target = e.target
    if (selector) { // 代理绑定
      if (target.matches(selector)) { // 元素能否被指定的选择器字符串选择
        fn.call(target, e)
      }
    } else { // 普通绑定
      fn.call(target, e)
    }
  })
}

// 测试
const div1 = document.getElementById('div1')
bindEvent(div1, 'click', 'a', function(e) {
  e.preventDefault()
  alert(this.innerHTML)
})
posted @ 2022-04-11 16:33  Better-HTQ  阅读(276)  评论(0编辑  收藏  举报