DOM--事件委托

115 阅读1分钟

DOM事件流

DOM事件流包括三个阶段:事件捕获阶段,处于目标阶段、事件冒泡阶段

addEventListener(type, listener[, options])

addEventListener(type, listener[, useCapture])

  • options,{once表示值调用一次,capture事件是否在捕获阶段执行,passive表示是否调用preventDefault方法},默认都是false
  • useCapture,为布尔值,指定事件是否在捕获或冒泡阶段执行。默认为false,冒泡阶段路径元素的事件才会触发

事件委托

事件委托,顾名思义,就是将本来需要 A 处理的事情,委托给 B 来处理。事件委托又称事件代理,事件委托就是利用事件冒泡 如上图,当点击son1后,得到结果如下

grandFather.addEventListener('click', function(e){ console.log('grandFather') }, false);
father1.addEventListener('click', function(e){ console.log('father1') }, false);
son1.addEventListener('click', function(e){ console.log('son1') }, false);

//son1
//father1
//grandFather

当把useCapture参数都改为true

xxx.addEventListener('click', function(e){ console.log('xxx') }, true);
//grandFather
//father1
//son1、

事件委托的应用

如果在需要有多个DOM事件需要监听的情况下,给每一个DOM都绑定监听函数,对性能会有极大的影响,因此,有一解决方案为事件委托。

  • currentTarget:表示此事件绑定的元素
  • target:通俗理解为表示触发一系列事件的源头

如上例子,点击son1,进入grandFather的监听函数,e.currentTarget就是grandFather元素,e.target就是son1 元素

了解冒泡与target后,不难可以想到若是在几百个dom监听之中,只需把监听函数绑定在父容器上即可,给div都绑定自定义的data-name属性,这样就可以非常容易得到目标元素内容

参考链接