DOM事件模型与事件委托

事件

JS与HTML之间的交互通过事件实现。
事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。
可以使用监听器来预定事件,以便事件发生时执行相应的代码。这种在传统软件工程中被称为观察者模式

事件流

事件流描述的是从页面中接受事件的顺序

事件冒泡

微软提出了名为事件冒泡的事件流。
事件从目标元素开始执行,一层一层往上执行,直到最顶层的元素

事件捕获

网景提出另一种事件流名为事件捕获。
事件从最顶层元素开始执行,一层一层往下执行,直到目标元素。
标准的浏览器事件流是 事件捕获流

DOM事件模型

DOM事件模型分为捕获和冒泡。一个事件发生之后,会在子元素和父元素之间传播,这种传播分成三个阶段:

第一阶段:从window对象传导到目标节点(从外到内),称之为"捕获阶段";

第二阶段: 在目标节点上触发,称之为"目标阶段";

第三阶段: 从目标节点传回window对象(从内到外),称之为"冒泡阶段";

DOM级别与DOM事件

DOM级别一共可以分为四个级别:DOM 0级(通常把DOM1规范形成之前的叫做DOM 0级)、DOM 1级、DOM 2级、DOM 3级。

DOM事件分为三个级别:DOM 0级事件处理,DOM 2级事件处理、DOM 3级事件处理
DOM 1级标准没有相关事件内容,所以没有DOM 1级事件

HTML事件处理程序

最早的事件处理方式是HTML事件处理程序,也是最早的事件处理方式。
直接在HTML代码里面定义了一个 onclick属性触发事件
缺点:HTML和JavaScript代码紧密耦合,如果我们需要修改函数名,HTML代码和javaScript代码都需要改动。
优点:不需要操作DOM就可以完成事件绑定
在这里插入图片描述

DOM 0级事件

DOM 0级事件绑定,在javaScript代码中指定对象,将一个函数赋值给一个事件处理属性。
规避了HTML事件中HTML代码和javaScript代码耦合的问题,而且可以通过给事件处理属性赋值null来解绑事件。

缺点

  1. 不能给一个元素同时添加多个事件。
  2. 不能控制元素的事件流,当前元素事件在冒泡阶段执行
    在这里插入图片描述

DOM 2级事件

DOM 2级事件定义了addEventListener和removeEventListener两个方法,分别用来绑定和解绑事件方法中包含三个参数:

  1. event-name: 事件名称,可以是标准的DOM事件
  2. callback: 回调函数,当事件触发时,函数会被注入一个参数为当前的事件对象 event
  3. useCapture:是否在捕获时候执行事件处理函数,默认是false。
    IE8级以下版本不支持addEventListener和removeEventListener,需要使用attachEvent(‘onclick’, showFn)绑定事件和detachEvent(‘onclick’, showFn) 解绑事件, IE8以下版本只支持冒泡型事件。
    在这里插入图片描述

DOM 3级事件

DOM3级事件是在DOM2级事件的基础上添加很多事件类型。
UI事件,当用户与页面上的元素交互时触发,如:load、scroll
焦点事件,当元素获得或失去焦点时触发,如:blur、focus
鼠标事件,当用户通过鼠标在页面执行操作时触发如:dbclick、mouseup
滚轮事件,当使用鼠标滚轮或类似设备时触发,如:mousewheel
文本事件,当在文档中输入文本时触发,如:textInput
键盘事件,当用户通过键盘在页面上执行操作时触发,如:keydown、keypress
合成事件,当为IME(输入法编辑器)输入字符时触发,如:compositionstart
变动事件,当底层DOM结构发生变化时触发,如:DOMsubtreeModified
同时DOM3级事件也允许使用者自定义一些事件。
在这里插入图片描述

事件委托

事件委托还有一个名字叫事件代理,javaScript高级程序设计上讲:事件委托就是利用事件冒泡,指定一个事件处理程序,就可以管理某一类型的所有事件。

优点:
  1. 减少内存消耗,提高性能。
    如果给每个列表项一一都绑定一个函数,那对于内存消耗是非常大的,效率上需要消耗很多性能。借助事件代理,我们只需要给父容器绑定方法即可,
  2. 动态绑定事件
    在很多时候,我们需要通过用户操作动态的增删列表项元素,如果一开始给每个子元素绑定事件,那么在列表发生变化时,就需要重新给新增的元素绑定事件,如果用事件代理就会省去很多这样麻烦。

Event对象常见的应用

1. event. preventDefault()

如果调用这个方法,默认事件行为将不再触发

2. event.stopPropagation()

方法阻止事件冒泡到父元素

3. stopImmediatePropagation() 方法阻止监听同一事件的其他事件监听器被调用。

如果多个事件监听器被附加到相同元素的相同事件类型上,当此事件触发时,它们会按其被添加的顺序被调用。如果在其中一个事件监听器中执行 stopImmediatePropagation() ,那么剩下的事件监听器都不会被调用。

4. Event.target

触发事件的对象 (某个 DOM 元素) 的引用

5. Event.currentTarget

标识是当事件沿着 DOM 触发时事件的当前目标。它总是指向事件绑定的元素,而 Event.target 则是事件触发的元素。

改变冒泡捕获的顺序

在 DOM 标准事件模型中,是先捕获后冒泡。但是如果要实现先冒泡后捕获的效果,对 于同一个事件,监听捕获和冒泡,分别对应相应的处理函数,监听到捕获事件,先暂 缓执行,直到冒泡事件被捕获后再执行捕获之间。

参考文档

https://zhuanlan.zhihu.com/p/171760778

https://www.jianshu.com/p/622d994906f7

https://segmentfault.com/a/1190000017259386

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

程序员的下一个风口

面对近一年的裁员潮,以及 GPT 出现带来的 AI 颠覆潮流,各种话题出现:「前端已死」、「后端已死」、「Copy/Paste 程序员将被 AI 取代」。程序员行业是否还有发展空间? 这一两年的就业机会是因为经济衰落周期内造成的,不…

MATLAB 常用数学函数和数组和字符串、元胞数组和结构体,MATLAB 编程,关系运算符和逻辑变量

目录 MATLAB 零基础学习 简介 使用平台 一、MATLAB 界面 二、基础操作 使用方法 常用数学函数 初等函数 三角函数 指数和对数 复数 标点符号 常用操作 三、文件类型 数组 一、数组基础知识 二、数组创建与操作 创建 数组操作 字符串数组 字符串、元胞数组…

移动互联网市场是不需要Android 开发了吗?

就近有不少朋友在吐槽:如今Android工作真的难找!从年初找到了现在,是市场不需要Android 开发人才了,人都迷茫了,是不是应该考虑转行了? 其实这种情况往年也是有的,但是今年显得的更严重一些。我…

在数据化知识经济的时代,你该学会如何经营好自己的知识管理

在当今的数据化知识经济时代,知识管理已经越来越成为了一个必备的技能。在这个竞争激烈的时代,拥有良好的知识管理能力,可以帮助我们更好地应对各种挑战和机遇。 如何经营好自己的知识管理 一、认识知识管理的重要性 知识管理是指通过系统…

回溯法--N皇后问题

N皇后问题 一、问题描述二、示例2.1 四皇后的2个可行解2.2 过程图示 三、问题分析3.1涉及到的概念递归回溯 3.2 分析 四、 代码实现4.1 实现思路宏观:微观: 4.2 递归函数NS图4.3 代码 一、问题描述 1、按照国际象棋的规则,皇后可以攻击与之处…

腾讯面试经验,岗位是C++后端

分享一篇腾讯面经,岗位是C后端,考察的内容是C、Redis、网络。 c shared_ptr的原理 答:内部的共享数据和引用计数实现 补充: shared_ptr多个指针指向相同的对象。shared_ptr使用引用计数,每一个shared_ptr的拷贝都…

OpenResty(Nginx)示例

Nginx Nginx概念: 聊到Nginx,先简单讲一下Nginx的基本概念 Nginx是一个高性能的、开源的 Web 服务器和反向代理服务器软件,由 Igor Sysoev 开发。它可以作为 HTTP 服务器使用,也可以作为负载均衡器、HTTP 缓存、反向代理和邮件代理等其他功…

公有云云硬盘(EBS)有效范围内扩容/存储规格变更指导手册

一、背景 某公有云环境中,云主机直连的云硬盘存储某数据库数据,随着数据的积累,大约10亿多条数据,云硬盘急需扩容,但前期规划云硬盘未开启lvm卷,且当前存储容量未达EBS容量限制,最大可达32T,因此决定采用EBS规格变更的方式来实现主机存储的扩容; 二、注意点: 1)过…

WebGIS支持国内各地方坐标系数据展示的方案

在我们的实际项目开发过程中,会存在着很多的客户提供的数据是地方坐标系的数据,这些数据通常是一些类似于地块数据,点位数据等等的矢量数据。如何加载这些数据可能会让大家有些头疼。我们这篇文章来给大家提供几种解决方案。 首先要清楚一个基础的地理学知识,那就是地理坐…

5年测试被裁,去面试差点被问哭了······

我的个人背景非常简单,也可以说丝毫没有亮点。 学历普通,计算机专业二本毕业,毕业后出来就一直在一家小公司,岁月如梭细,算了下至今从事软件测试已经5年了,也点点点了五年,每天都是重复的工作&…

WiFi(Wireless Fidelity)基础(十)

目录 一、基本介绍(Introduction) 二、进化发展(Evolution) 三、PHY帧((PHY Frame ) 四、MAC帧(MAC Frame ) 五、协议(Protocol) 六、安全&#x…

【AUTOSAR】【以太网】TCPIP

目录 一、概述 二、约束和假设 三、依赖模块 3.1 EthIf 3.2 EthSM 3.3 SoAd 3.4 KeyM 3.5 CSM 四、功能说明 4.1 系统扩展性 4.2 IPv4 4.2.1 IPv4 4.2.2 ARP 4.2.3 Auto-IP 4.2.4 ICMP 4.3 IPv6 4.4 IPSec 4.5 基于IP的协议 4.5.1 本地地址表 4.5.2 UDP 4…

渗透测试--2.漏洞探测和利用

目录 一.漏洞分类 二.漏洞探测 三.漏洞利用 四.漏洞扫描 1.Nessus 2.Web应用漏洞扫描器——DVWA 五.Metasploit漏洞利用 一.漏洞分类 网络漏洞 系统漏洞 应用漏洞 人为不当配置 二.漏洞探测 渗透测试是一种测试网络、应用程序和系统安全性的方法,旨在发现…

phpstorm 配置xdebug

目录 配置全局环境 phpstorm 项目xdebug配置 额外补充: 配置全局环境 本地运行命令 php -v, 看是否有Xdebug相关的信息若没有,安装xdebug,以下是mac相关方式: pecl search xdebug 查询,找到之后用 pecl install xdebug…

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

绪论 本章我们接着对类和对象进行探索,这是一个在我们c中比较重要的知识点,下面我们才是我们类和对象的更加深入且困难的知识点,希望你能通过这篇文章对类其有更加深入的了解。 话不多说安全带系好,发车啦(建议电脑观看…

【Linux】shell编程之—函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、概述二、函数的查看和删除1.查看 declare2.删除 declare 三、函数的返回值1.return 返回值2.echo 返回值 四、函数的参数传入与变量范围五、函数的应用1.阶乘2.…

GPT神奇应用:给孩子做每日安排

正文共 1163 字,阅读大约需要 4 分钟 家长必备技巧,您将在4分钟后获得以下超能力: 快速生成每日安排计划 Beezy评级 :B级 *经过简单的寻找, 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片…

前端部署vue项目到腾讯云服务器

先把dist包上传服务器 可以使用宝塔、FileZilla、手动上传等等方式 已有腾讯云服务器之后进入面板界面 然后安装Nginx 请一步一步,紧跟步骤 第一步 安装gcc-c 编译器。nginx依赖的 pcre 和 zlib 包 yum -y install gcc zlib zlib-devel pcre-devel openssl openss…

Java中的七种设计原则

1.开闭原则 对扩展开放,对修改关闭。在程序需要进行扩展的时候,不能去修改原有的代码,要去实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。 下面是输入法设置皮肤的例子: // 抽象皮…

制造业为什么要数字化?有何意义?

制造业为什么要数字化?有何意义? 党的二十大报告指出,要“坚持把发展经济的着力点放在实体经济上,推进新型工业化”“促进数字经济和实体经济深度融合”。 新一代信息技术催生第四次工业革命,互联网、大数据、人工智能…