yuanyuanbyte / Blog

圆圆的博客,预计写七个系列:JavaScript深入系列、JavaScript专题系列、网络系列、Webpack系列、Vue系列、JavaScript基础系列、HTML&CSS应知应会系列。
306 stars 125 forks source link

JavaScript 深入系列之 DOM 事件响应机制 #93

Open yuanyuanbyte opened 2 years ago

yuanyuanbyte commented 2 years ago

本系列的主题是 JavaScript 深入系列,每期讲解一个技术要点。如果你还不了解各系列内容,文末点击查看全部文章,点我跳转到文末

如果觉得本系列不错,欢迎 Star,你的支持是我创作分享的最大动力。

DOM 事件响应机制

什么是事件流?

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

事件流是事件在目标元素和顶层元素间的触发顺序, 在早期,微软和网景实现了相反的事件流,网景主张捕获方式,微软主张冒泡方式:

后来 w3c 采用折中的方式, 规定先捕获再冒泡平息了战火。如此一个事件就被分成了三个阶段(是的, 不光是捕获和冒泡):

那这里又有一个新的疑问❓❓❓ 既然捕获和冒泡阶段都会触发事件, 那先捕获再冒泡, 岂不是路径上的元素都会触发两次事件?

在 DOM2 中, 事件监听 addEventListener() 的第三个参数 决定事件了是在捕获阶段生效还是在冒泡阶段生效, 接下来简要学习下 addEventListener

还有一个小问题, 为什么要单独区分一个目标阶段? 下面会做出解答。

addEventListener

EventTarget.addEventListener() 方法将指定的监听器注册到目标元素上, 当该对象触发指定的事件时, 指定的回调函数就会被执行。addEventListener有三个参数:

 element.addEventListener(event, function, useCapture)

一个默认的事件监听:

document.getElementById("myBtn").addEventListener("click", function() {
    myFunction(p1, p2);
});

注意:❗ ❗ ❗ 对于目标元素上的事件监听器来说, 事件会处于目标阶段, 而不是冒泡阶段或者捕获阶段. 在目标阶段的事件会触发该元素上的所有监听器, 而不在乎这个监听器到底在注册时 useCapturetrue 还是 false.

现代浏览器默认的响应机制是什么?

我们注意到addEventListener() 的第三个参数是可选的,而默认值是false,除非主动的设置该参数为true,否则 我们添加的事件监听器默认情况就是在冒泡阶段执行,如此 在某种程度上是不是可以说现代浏览器默认的响应机制是 事件冒泡(仅个人说法)

查看全部文章

博文系列目录

交流

各系列文章汇总:https://github.com/yuanyuanbyte/Blog

我是圆圆,一名深耕于前端开发的攻城狮。

weixin