事件流、事件捕获和事件冒泡的介绍

举报
伯约同学 发表于 2022/02/18 23:22:02 2022/02/18
【摘要】 事件流、事件捕获和事件冒泡的介绍最近有用到对应的场景,下班了特地来整理下响应的概念,巩固下知识。我们在点击页面时,事件发生时会在各元素节点按照一定的顺序进行传播,这种传播过程就称作事件流。事件流分为三个阶段:1、事件捕获阶段事件从window发出,不断向子元素寻找对应的目标节点2、事件目标阶段事件找到了对应的目标节点,即此时再往下已经没有对应的节点3、事件冒泡阶段事件从节点位置网上回溯到文档...

事件流、事件捕获和事件冒泡的介绍

最近有用到对应的场景,下班了特地来整理下响应的概念,巩固下知识。

我们在点击页面时,事件发生时会在各元素节点按照一定的顺序进行传播,这种传播过程就称作事件流。

事件流分为三个阶段:

1、事件捕获阶段

事件从window发出,不断向子元素寻找对应的目标节点

2、事件目标阶段

事件找到了对应的目标节点,即此时再往下已经没有对应的节点

3、事件冒泡阶段

事件从节点位置网上回溯到文档的根节点

我们在使用给dom添加事件时一般使用addEventListener方法,该方法传入三个参数

1、对应的事件名称如:click

2、函数:触发对应的交互响应后执行的函数

3、userCapture:指定事件是在捕获还是冒泡阶段执行,默认false。(或者传入一个options选项,但是今天不讲这个)

语法:

target.addEventListener(type, listener, useCapture);

示例

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
  <div id="container">
  <button id="btn">DOM事件流</button>
 </div>
  <script>
  document.body.addEventListener("click", function (event) {
   console.log("body 事件冒泡");
  }, false);
  document.body.addEventListener("click", function (event) {
   console.log("body 事件捕获");
  }, true);
  var btn = document.getElementById("btn");
  btn.addEventListener("click", function (event) {
   console.log("btn 事件冒泡1");
  }, false);
  btn.addEventListener("click", function (event) {
   console.log("btn 事件捕获");
  }, true);
  btn.addEventListener("click", function (event) {
   console.log("btn 事件冒泡2");
  }, false);
  var container = document.getElementById("container");
  container.addEventListener("click", function (event) {
   console.log("container 事件冒泡");
  }, false);
  container.addEventListener("click", function (event) {
   console.log("container 事件捕获");
  }, true);
 </script>
</body>
</html>
// 对应的打印结果
body 事件捕获
test.html:37 container 事件捕获
test.html:26 btn 事件捕获
test.html:23 btn 事件冒泡1
test.html:29 btn 事件冒泡2
test.html:34 container 事件冒泡
test.html:15 body 事件冒泡

可以看到,都是先触发捕获再触发冒泡事件,先从body(上)到btn(下),再从btn(下)到body(上)。有个例子就讲的挺有形象,就好比一个塑料扔到水里,先往下沉(捕获阶段),沉到最底部(目标阶段)再慢慢浮起来(冒泡阶段)。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。