js中的事件流

123 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

js中的事件流

事件发生时,会在元素节点根节点之间按照特定的顺序传播,路径所经过的所有节点都会收到该事件,这个传播过程即DOM事件流。

两种事件流模型:

事件传播的顺序对应浏览器的两种事件流模型:捕获型事件流和冒泡型事件流。

冒泡型事件流:事件的传播是从最特定事件目标到最不特定的事件目标。即从DOM树的叶子到根。【推荐】

即从被触发的具体的DOM节点一直到根节点Document元素。

捕获型事件流:事件的传播是从最不特定事件目标到最特定的事件目标。即从DOM树的根到叶子。

即从文档的根节点Document元素到最内层被触发的具体的DOM节点。

事件捕获的思想就是不太具体的节点应该更早接收到事件,而最具体的节点最后接收到事件。

<body>
    <div id="myDiv">Click me!</div>
</body>

单击页面中的

元素,

在冒泡型事件流中click事件传播顺序为

—》 —》 —》document

在捕获型事件流中click事件传播顺序为document—》 —》 —》

DOM标准规定事件流包括三个阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。

  • 事件捕获阶段:实际目标
    )在捕获阶段不会接收事件。也就是在捕获阶段,事件从document到再到就停止了。
  • 处于目标阶段:事件在
    上发生并处理。但是事件处理会被看成是冒泡阶段的一部分
  • 冒泡阶段:事件又传播回文档。

事件代理(事件委托)的原理用到的就是事件冒泡和目标元素,把事件处理器添加到父元素,等待子元素事件冒泡,并且父元素能够通过target(IE为srcElement)判断是哪个子元素,从而做相应处理。当子元素的事件冒泡到父元素时,可以检查事件对象的target属性,捕获真正被点击的节点元素的引用 。

js绑定事件时通过addEventListener函数,它有三个参数,第三个参数若是true,则表示采用事件捕获,若是false,则表示采用事件冒泡,默认是false。

ele.addEventListener('click',doSomething,true)