什么是JS事件流

news2024/11/19 20:40:36

什么是JS事件流?

一:事件冒泡

<!DOCTYPE html>
<html lang="en">
<head>
  <title>事件冒泡例子</title>
</head>
<body>
  <div id="box">点击我</div>
</body>
</html>

上述的代码点击页面的div元素后,click事件会以如下顺序发生:

1.<div>
2.<body>
3.<html>
4.document

此事件流就是事件冒泡

图1所示:

事件冒泡

代码模拟事件冒泡

<!DOCTYPE html>
<html lang="en">
<head>
  <title>事件冒泡例子</title>
</head>
<body>
  <div id="box">点击我</div>
</body>
<script>
  const boxDiv = document.getElementById('box')
  const body = document.body
  const html = document.documentElement
  boxDiv.addEventListener('click', function(e) {
    console.log('boxDiv',this)
  })
  body.addEventListener('click', function(e) {
    console.log('body', this)
  })
  html.addEventListener('click', function(e) {
    console.log('html:', this)
  })
  document.addEventListener('click', function(e) {
    console.log('document:', this)
  })
</script>
</html>

打印结果如下:
在这里插入图片描述


二:事件捕获

点击页面的div元素后,click事件会以如下顺序发生:

1.document
2.<html>
3.<body>
4.<div>

此事件流就是事件捕获

图2所示:

事件捕获

其中:

触发事件为 到达目标,通常在事件处理时被认为是冒泡阶段的一部分。

也就是说捕获一般从document到html,再到body…(目标对象的父标签)就结束了。

代码模拟事件捕获

<!DOCTYPE html>
<html lang="en">
<head>
  <title>事件冒泡例子</title>
</head>
<body>
  <div id="box">点击我</div>
</body>
<script>
  const boxDiv = document.getElementById('box')
  const body = document.body
  const html = document.documentElement
  boxDiv.addEventListener('click', function(e) {
    console.log('boxDiv',this)
  }, true)
  body.addEventListener('click', function(e) {
    console.log('body', this)
  }, true)
  html.addEventListener('click', function(e) {
    console.log('html:', this)
  }, true)
  document.addEventListener('click', function(e) {
    console.log('document:', this)
  }, true)
</script>
</html>

打印结果如下:

在这里插入图片描述


三:事件处理程序一般有以下两种方式:

1. 事件处理程序的名字以"on",例如上述的点击也可以写成如下:
// 给div添加点击事件  
    const boxDiv = document.getElementById('box')
    boxDiv.onclick = function (e) {
    	console.log('boxDiv',this)
    }
// 移除div的点击事件
	boxDiv.onclick = null
2. Event是为事件处理程序的添加和移除定义了两个方法addEventListener()removeEventListener(),这两个方法接受三个参数:事件名事件处理函数布尔值(默认false),true表示在捕获阶段调用事件处理程序,false表示在冒泡阶段用事件处理程序。
// 给div添加点击事件   
const boxDiv = document.getElementById('box')
boxDiv.addEventListener('click', function(e) {
	console.log('boxDiv add click',this)
})
// 移除div的点击事件   
boxDiv.removeEventListener('click', function(e) { // 无效果
	console.log('boxDiv remove click',this) 
})

// 打印出
boxDiv add click <div id="box">​点击我​</div>

更换以下:

const boxDiv = document.getElementById('box')

const handler = function (e) {
    console.log('boxDiv handler')
}
boxDiv.addEventListener('click', handler, false)
setTimeout(() => {
    boxDiv.removeEventListener('click', handler, false)
    console.log('点击事件已销毁')
}, 3000);

通过以上代码可知,注意事项:addEventListener() 添加的匿名函数无法删除!!!

阻止捕获和冒泡阶段中当前事件的进一步传播可以使用**event.stopPropagation()**

 const boxDiv = document.getElementById('box')
 const body = document.body
 const html = document.documentElement
 boxDiv.addEventListener('click', function(e) {
     console.log('boxDiv add click',this)
     e.stopPropagation()
 })
body.addEventListener('click', function(e) {
    console.log('body', this)
})
html.addEventListener('click', function(e) {
    console.log('html:', this)
})
document.addEventListener('click', function(e) {
    console.log('document:', this)
})

四:事件委托

“过多事件处理程序“的解决方案是使用事件委托。事件委托是利用事件冒泡,可以只使用一个事件处理程序来管理一种类型的事件。

示例代码:

// 点击li打印li内的文本
<!DOCTYPE html>
<html lang="en">
<head>
  <title>事件委托的例子</title>
</head>
<body>
  <ul id="ul">
    <li>我是第1个li</li>
    <li>我是第2个li</li>
    <li>我是第3个li</li>
    <li>我是第4个li</li>
    <li>我是第5个li</li>
    <li>我是第6个li</li>
  </ul>
  <script>
    const ul = document.getElementById('ul')
    ul.onclick = function (e) {
      console.log(e.target.innerHTML)
    }
  </script>
</body>
</html>

五:总结

  • Events规范事件流分为3个阶段:事件获,到达目标,事件冒泡
  • 实际当中几乎不会使用事件捕获,都是使用事件冒泡
  • 阻止捕获和冒泡可以使用event.stopPropagation()。
  • addEventListener()添加的匿名函数无法删除,需定义类似一个handler同样的参数来用removeEventListener()移除。
  • 事件委托就是利用事件冒泡的机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/537146.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

需求管理(三)需求过程

一、需求规格说明 1.1需求规格说明概述 需求获取的目标是得到用户的需求——收集需求信息 需求分析的目标是更深刻的理解用户的需求——界定能够让用户满意的解决方案和准则 需求规格说明的目标是定义用户的需求——准确描述其需求和解决方案 需求规格说明文档的撰写流程如下图…

DHCP+链路聚合+NAT+ACL小型实验

实验要求: 1.按照拓扑图上标识规划网络。 2.使用0SPF协议进程100实现ISP互通。 3.私网内PC属于VLAN1O, FTP Server属于VLAN2O,网关分 别为所连接的接入交换机&#xff0c;其中PC要求通过DHCP动态获取 4:私网内部所有交换机都为三层交换机&#xff0c;请合理规划VLAN&#…

关于对tinymce富文本编辑器使用的心得

本文分为一下几个功能&#xff1a; tinymce初始化的一些配置在工具栏和文本中间插入特定的标题和摘要自定义工具栏按钮&#xff0c;实现特定功能上传图片时去掉网络上传功能粘贴过来的图片实现默认上传给图片添加水印功能实现一键排版 一、tinymce初始化的一些配置 1、首先需要…

机械大专生能学会云计算吗,完全零基础的

机械大专生能学会云计算吗&#xff0c;完全零基础的 正常来说&#xff0c;大专及以上学历都能学会云计算&#xff0c;但是会和满足就业需求是两回事哈。如果你想通过学习就业&#xff0c;就需要根据当下相关岗位的普遍技术需求以及其他方面的要求&#xff0c;来针对性的学习和提…

契约锁连续入选金融信创生态实验室「金融信创优秀解决方案」

近日&#xff0c;中国人民银行直属机构--金融信创生态实验室正式公布《金融信创优秀解决方案&#xff08;第二期&#xff09;》评选结果&#xff0c;契约锁「印章管控方案」成功入选&#xff0c;并被收录在“一般业务类-产业机构”名录&#xff0c;为金融机构的印章管控及电子签…

一个简单的运筹优化生产问题求解过程

运筹相关的一个简单的生产问题 题目来自于清华大学出版的《运筹学》第四版。 一、问题描述 二、图解法 三、单纯形法 第一次迭代&#xff1a; 第二次迭代&#xff1a; 第三次迭代&#xff1a; 下面描述一下第三次迭代的详细过程&#xff1a; 从表达式&#xff08;2-18&#…

一文理解Kafka

概述 Kafka是一个基于Zookeeper的分布式消息中间件&#xff0c;支持消息分区&#xff0c;提供发布和订阅功能。使用Scala编写&#xff0c;主要特点是可水平扩展&#xff0c;高吞吐率以及高并发。 常见的使用场景&#xff1a; 企业级别活动数据和运营数据的消息传递&am…

2023年自动化测试如何学?从头开始自动化测试指南,一路晋升...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

❤ 用JS 从零开始开发一个 Chrome 提示插件(简单易学 10分钟搞定)

❤ 为自己量身手写一个chrome暖心插件&#xff08;资源文章最后&#xff09; ❤ 最近看到了一个很温馨的提示代码,于是想着为自己的浏览器做一款chrome插件 1、chrome 插件理解&#xff1a; 一个html js css image的一个web应用 不同于普通的web应用&#xff0c; chrome插…

怎么把视频转换成gif动图,5个超强工具分享

在我们平时的聊天中&#xff0c;会经常遇到需要将视频转换成gif动图的情况。这样一来&#xff0c;我们可以轻松将视频中的经典片段转换成gif动图&#xff0c;方便分享和娱乐。同时&#xff0c;这种方式不仅能够传播视频内容&#xff0c;还能带来很多趣味。 然而&#xff0c;许…

1,Hadoop的基本概念和架构

Hadoop的基本概念和架构 学习路线 hadoop的基本概念和架构hadoop的安装和配置hadoop的HDFS文件系统hadoop的MapReduce计算框架hadoop的YARN资源管理器hadoop的高级特效&#xff0c;如HBase&#xff0c;Hive&#xff0c;Pig等hadoop的优化和调优hadoop的应用场景&#xff0c;如…

Qt中的互斥锁(QMutex和QMutexLocker)

QMutex和QMutexLocker 类 QMutex 的主要函数有&#xff1a; lock ()&#xff1b; 加锁&#xff0c;如果该互斥锁被占用&#xff0c;该函数阻塞&#xff0c;直到互斥锁被释放。unlock ()&#xff1b; 解锁bool tryLock (int timeout 0)&#xff1b; 表示尝试去加锁&#xff0…

如何用R语言分析COVID-19相关数据

一、概述 COVID-19是当前全球面临的一项重大挑战。 本文将介绍如何使用R语言分析COVID-19相关数据&#xff0c;探索其感染率、死亡率和人口特征的相关性&#xff0c;以及使用统计建模方法预测COVID-19的死亡率。 二、数据导入与筛选 COVID-19 Data Repository by the Center…

CSS的使用

CSS 概述 CSS 是一门语言&#xff0c;用于控制网页表现。我们之前介绍过W3C标准。W3C标准规定了网页是由以下组成&#xff1a; 结构&#xff1a;HTML表现&#xff1a;CSS行为&#xff1a;JavaScript CSS也有一个专业的名字&#xff1a;Cascading Style Sheet&#xff08;层…

一起了解大数据可视化开发

在办公自动化快速发展的今天&#xff0c;大数据可视化开发的应用价值普遍增高。借助它的灵活、便捷、易操作等特性&#xff0c;可以助力企业实现办公自动化提质增效&#xff0c;数字化进程快速发展&#xff0c;因而得到了大家的信赖与支持。那么&#xff0c;什么是大数据可视化…

Spring Boot 使用SSL-HTTPS

Spring Boot 使用SSL-HTTPS HTTPS协议可以理解为HTTPSSL/TLS&#xff0c;可以理解为HTTP下加入了SSL层&#xff0c;通过SSL证书来验证服务器的身份&#xff0c;并为浏览器和服务器之间的通信进行加密。 SSL(Secure Socket Layer安全套接字层)&#xff1a;SSL协议位于TCP/IP协…

【Jenkins】Jenkins拉取Github代码(windows)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

虹科新品 | 高可靠性、可适用于高磁/压的线性传感器!

PART 1 什么是线性传感器&#xff1f; 基本上&#xff0c;线性传感器是一种用于测量位移和距离的设备&#xff0c;具有高可靠性。测量网格通过光学传感器移动测量数据&#xff0c;数据被光学记录并通过控制器转换为电气数据&#xff0c;而控制器又可以转换为路径。 因此&…

怎么删除文件?分享3个文件删除的正确方法!

案例&#xff1a;怎么删除文件 【我每次想要删除文件时都感觉好麻烦啊&#xff01;想问问大家在删除文件时都是怎么进行操作的呢&#xff1f;】 在日常使用电脑的过程中&#xff0c;删除文件是一个很常见的操作&#xff0c;但是并不是每个人都知道删除文件的正确方式。正确的删…

企业做网站需要什么条件?

随着互联网的不断发展&#xff0c;企业做网站已成为市场营销的必要手段。但是&#xff0c;要想让一个网站达到预期效果&#xff0c;需要具备一定的条件和技巧。本文将从以下几个方面介绍企业做网站的条件和优化方法。 第一步&#xff1a;明确目标 企业做网站的第一步就是要明确…