DOM事件模型与事件委托

news2025/1/16 16:05:25

事件

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

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

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

相关文章

【李老师云计算】实验三:在Docker中部署Hadoop集群

索引 0. 前言1. Docker1.1 安装Docker1.2 启动Docker 2. Dokcer部署Hadoop2.1 设计Hadoop集群结构2.2 拉取Hadoop镜像2.3 ★解决拉取镜像时 - no space left on device2.4 创建Docker容器2.5 ★解决docker ps没有内容2.6 通过终端进入容器2.7 关闭防火墙2.8 配置SSH2.8.1 设置主…

springboot+vue留守儿童爱心网站(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的留守儿童爱心网站。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…

这个代码生成器火了…SmartSoftHelp

火了,火了…SmartSoftHelp 开源C#代码生成器,专注.NET,Sqlserver,最简单,最干净,支持自编码的开源工具,SmartSoftHelp 开发辅助优化工具! 下载地址:https://pan.baidu.…

PC端网页特效

元素偏移量offset系列:(使用其相关属性可以动态的得到该元素的位置(偏移)、大小 (1)获得元素距离带有定位父元素的位置 …

sqlserver 中的表值函数和标量函数

目录 一、表值函数 1.内联表值函数 1.创建函数 2.调用函数 3.返回结果 2.多语句的表值函数 2.调用函数 3.返回结果 3.内联表值函数和多语句的表值函数的区别 1.语法上 2.结构上 二、标量函数 1.创建函数 2.调用函数 2.返回结果 总结 一、表值函数 表值函数是返回一个Table类型…

2023年必备!这些值得信赖的问卷调查工具

随着我们进入2023年,可靠的调查问卷工具对研究和数据收集的重要性比以往任何时候都更加明显。随着在线调查和远程数据收集的兴起,越来越多的用户和企业都开始注重数据安全,所以使用值得信赖和有效的工具至关重要。在这篇文章中,小…

Spring的第十六阶段:数据库的事务隔离级别

数据库事务隔离级别 1、为什么会出现数据库的隔离级别呢? 数据库隔离级别是为了解决数据库并发访问过程中产生的各种数据安全问题. 四种事务隔离级别: 一:读未提交 read uncommitted 二:读已提交 read committed ( oracle默认 ) 三&…

教大家如何使用VS Code远程开发ubuntu和服务器项目

目录 前提条件 一、ubuntu中安装openssh服务器 二、配置本地VSCode 三、本地查看、编辑ubuntu中的代码 前提条件 1.本地已经安装了Visual Studio Code IDE软件, 2.ubuntu虚拟机安装完成 一、ubuntu中安装openssh服务器 1.1使用如下命名进行安装: …

测试老鸟总结,性能测试常见测试缺陷,卷出高级突破测试圈...

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

【机器学习】LightGBM 解读 (集成学习_Boosting_GBM)

【机器学习】LightGBM 解读 (集成学习_Boosting_GBM) 文章目录 【机器学习】LightGBM 解读 (集成学习_Boosting_GBM)1. 介绍2. 数据预处理2.1 基于梯度的单边采样(GOSS)2.2 互斥特征捆绑(EFB&am…

免费安装注册 IDM 使用流程,简单方便易操作 IDM 在B站没有显示下载按钮

文章目录 下载 IDM运行脚本winr快捷键调出运行窗口输入powershell并运行上述脚本开始注册注册成功IDM 在B站没有显示下载按钮 下载 IDM 官网链接:Internet Download Manager: The fastest download accelerator 运行脚本 # Enable TLSv1.2 for compatibility wi…

多目标优化算法求解无人机三维路径规划

一、无人机模型 无人机三维路径规划是无人机在执行任务过程中的非常关键的环节,无人机三维路径规划的主要目的是在满足任务需求和自主飞行约束的基础上,计算出发点和目标点之间的最佳航路。 1.1路径成本 无人机三维路径规划的首要目标是寻找起飞点和目…

Python学习19:输出斐波拉契数列的前n项

描述: 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列&a…

Unity2019配置JDK、SDK、NDK、Gradle

用Unity开发了一个使用AR Foundation的小项目,导出项目需要在安卓手机上进行测试。在导出时遇到了配置环境的问题,查找了很多方法终于解决。记录一下。 我所使用的unity版本是2019.2.12f。在完成项目需要导出时,在首选项设置中需要设置JDK、…

我的职业转型之路:从点工到自动化测试工程师仅用了四个月

目录 引言 1、知识体系化 2、我的成长路线 功能测试——>UI自动化 UI自动化——>接口自动化 接口自动化——>性能测试 软件测试工程师发展规划路线 一、测试基础 二、Linux必备知识 三、Shell脚本 四、互联网程序原理 五、MySQL数据库 六、抓包工具 七、…

Altium designer—STM32F103C8T6最小系统原理图

分享使用Altium designer软件绘制的STM32F103C8T6最小系统电路原理图 亲测可用,完整电路文件资源见文末链接 一、电路原理图 STM32F103C8T6是STM32入门级的芯片,性价比很高,资源相对比较丰富,该最小系统包括STM32F103C8T6芯片、…

使用预定义类

目录 🍅 一、对象与对象变量 🍎 二、Java类库中的LocalDate类 🥭 三、更改器方法与访问器方法 🧑‍💻CSDN主页:夏志121的主页 📋专栏地址:Java核心技术专栏 在Java中,…

形态学图像处理和图像分割MATLAB实验

文章目录 一、实验目的二、实验内容1. 开运算和闭运算实验。2. 用形态学处理提取边界。4. 全局阈值处理。 一、实验目的 理解腐蚀和膨胀的原理,掌握开运算、闭运算及形态学的边界提取。掌握孤立点检测、线检测和边缘检测的方法。掌握全局阈值处理的方法。 二、实验…

2023 上半年软件设计师知识点复习总纲

前言:全国计算机技术与软件专业技术资格(水平)考试(以下简称IT职业资格考试)是由中华人民共和国人事部主管,国家计算机网络与信息安全管理中心主办的一项国家级、权威性的计算机职业技能水平认证考试。主要…

【人力资源管理】第4集 免费开源ERP: Odoo 16 Appraisal员工绩效评估 构建一体化企业人力资源管理

文章目录 前言一、概览二、主要功能1.设置定期的员工评估2.构建正确的评估3.设计您自己的调查4.自动评估过程 总结 前言 在员工工作中创建评估。同时审查员工表现。 一、概览 员工评价 评估内容 目标制定 评价指标 评价分析 二、主要功能 1.设置定期的员工评估 强化贵公司的…