简述 DOM 事件和事件委托

126 阅读2分钟

1-DOM事件

捕获、目标与冒泡

W3C的标准文档 DOM Level 2 Events Specification规定,浏览器同时支持监听函数的两种调用顺序:事件捕获和事件冒泡。
从外向内(从parent到child)查找、调用监听函数,并提供事件信息,叫做事件捕获(Capture);
从内向外(从child到parent)查找、调用监听函数,并提供事件信息,叫做事件冒泡(Bubble)。

  • 注意: a. 如果没有监听函数,则跳过;
    b. 由开发者自己选择,把监听函数放在捕获阶段还是冒泡阶段。
    c. 事件流有三个阶段:捕获阶段(Capture Phase)、目标阶段(Target Phase)和冒泡阶段(Bubble Phase),所以顺序是先捕获、后冒泡;哪里有监听,就调用并提供事件信息

API: addEventListener

button.addEvent Listener('click', fn, bool)  
//如果bool不传,或为falsy值,就让fn走冒泡;如果bool为true,就让fn走捕获

特例

  1. 当只有一个div被监听的时候(不考虑父子同时被监听),fn分别在捕获和冒泡阶段监听click事件,此时用户点击的元素,就是开发者监听的——即 .target.currentTarget 是同一个元素;
  2. 捕获不可以取消,但是一些冒泡可以通过 .stopPropagation() 中断,一般用于封装某些独立的组件;
  3. 还有一些事件不可取消冒泡,比如 scroll,具体还有哪些可以查MDN原文版(see if the event is cancelable);
  4. 除去 MDN 罗列的100+种浏览器自带事件外,还可以自定义事件。

2-事件委托

运用代码去委托一个元素,代劳开发者本人进行监听的手法,叫做事件委托。 事件委托有两个优点,一是通过节省监听数来节省内存,二是可以监听动态元素。
一个元素如果不存在,或是此刻不存在,那么通过监听祖先元素,可以达到监听该动态元素的目的。
监听祖先元素是一个自上而下的思想模式,也可以说是逐步设计完善的一种模式,它本质上是通过逆向分解系统,获得对子代的监听/系统的洞察力。子元素代表未来,有无限可能,我们无法在一开始真实预测未来的全部,但是可以通过监听祖先元素,掌控/监听未知。