【前端学习——js篇】6.事件模型

news/2024/4/28 1:53:51

具体见:https://github.com/febobo/web-interview

6.事件模型

①事件与事件流

事件(Events)

事件是指页面中发生的交互行为,比如用户点击按钮、键盘输入、鼠标移动等。在js中,可以通过事件来触发相应的操作,例如执行函数、改变样式等。常见的事件包括点击事件(click)、键盘事件(keypress、keydown、keyup)、鼠标事件(mouseover、mouseout、mousedown、mouseup)等


事件流(Event FLow)

事件流描述了事件在页面中传播和被处理的顺序。在DOM树中,事件流可以分为冒泡阶段和捕获阶段。

  • 事件捕获阶段(Capturing Phase):事件从最外层的元素开始向最具体的元素传播。即事件从document对象开始,逐级向下传播到目标元素。

  • 目标阶段(Target Phase):事件到达目标元素本身。

  • 事件冒泡阶段(Bubbing Phase):事件从目标元素开始向上传播,逐级向上传播到document对象。

    在这里插入图片描述


<html><body><div id="d1"><button id="btn1">click me</button></div>
</body>
</html>
    //冒泡阶段var button = document.getElementById('btn1')var div = document.querySelector('#d1')div.onclick = function () {console.log('2. this is div');};document.body.onclick = function () {console.log('3.this is body');};document.onclick = function () {console.log('4.this is document');};window.onclick = function () {console.log('5.this is window');};button.onclick = function () {console.log('1.this is button');};

冒泡阶段结果:

1.this is button
2.this is div
3.this is body
4.this is document
5.this is window
//捕获阶段var button = document.getElementById('btn1')var div = document.querySelector('#d1')div.addEventListener('click', function () {console.log('2. this is div');}, true);document.body.addEventListener('click', function () {console.log('3.this is body');}, true);document.addEventListener('click', function () {console.log('4.this is document');}, true);window.addEventListener('click', function () {console.log('5.this is window');}, true);button.addEventListener('click', function () {console.log('1.this is button');}, true);

结果与冒泡相反。

②事件模型

事件模型可以分为三种:

  • 原始事件模型(DOM0级)
  • 标准事件模型(DOM2级)
  • IE事件模型(基本不用)

(1)原始事件模型

事件绑定监听函数比较简单, 有两种方式:

  • HTML代码中直接绑定
<input type="button" onclick="fun()">
  • 通过JS代码绑定
var btn = document.getElementById('.btn');
btn.onclick = fun;

【特性】

  • 绑定速度快

DOM0级事件具有很好的跨浏览器优势,会以最快的速度绑定,但由于绑定速度太快,可能页面还未完全加载出来,以至于事件可能无法正常运行

  • 只支持冒泡,不支持捕获
  • 同一个类型的事件只能绑定一次
<input type="button" id="btn" onclick="fun1()">var btn = document.getElementById('.btn');
btn.onclick = fun2;

如上,当希望为同一个元素绑定多个同类型事件的时候(上面的这个btn元素绑定2个点击事件),是不被允许的,后绑定的事件会覆盖之前的事件

删除 DOM0 级事件处理程序只要将对应事件属性置为null即可

btn.onclick = null;
(2)标准事件模型

通过 addEventListener 方法来注册事件处理程序,并通过第三个参数来指定事件处理程序是在捕获阶段执行还是在冒泡阶段执行。当第三个参数为 true 时,事件处理程序在捕获阶段执行;当为 false 或省略时,默认在冒泡阶段执行。


事件绑定监听函数的方式如下:

addEventListener(eventType, handler, useCapture)

事件移除监听函数的方式如下:

removeEventListener(eventType, handler, useCapture)

参数如下:

  • eventType指定事件类型(不要加on)
  • handler是事件处理函数
  • useCapture是一个boolean用于指定是否在捕获阶段进行处理,一般设置为false与IE浏览器保持一致

【特性】

  • 可以在一个DOM元素上绑定多个事件处理器,各自并不会冲突
btn.addEventListener(‘click’, showMessage1, false);
btn.addEventListener(‘click’, showMessage2, false);
btn.addEventListener(‘click’, showMessage3, false);
  • 执行时机

当第三个参数(useCapture)设置为true就在捕获过程中执行,反之在冒泡过程中执行处理函数

下面举个例子:

<div id='div'><p id='p'><span id='span'>Click Me!</span></p >
</div>

设置点击事件

var div = document.getElementById('div');
var p = document.getElementById('p');function onClickFn (event) {var tagName = event.currentTarget.tagName;var phase = event.eventPhase;console.log(tagName, phase);
}div.addEventListener('click', onClickFn, false);
p.addEventListener('click', onClickFn, false);

上述使用了eventPhase,返回一个代表当前执行阶段的整数值。1为捕获阶段、2为事件对象触发阶段、3为冒泡阶段

点击Click Me!,输出如下

P 3
DIV 3

可以看到,pdiv都是在冒泡阶段响应了事件,由于冒泡的特性,裹在里层的p率先做出响应

如果把第三个参数都改为true

div.addEventListener('click', onClickFn, true);
p.addEventListener('click', onClickFn, true);

输出如下

DIV 1
P 1

两者都是在捕获阶段响应事件,所以divp标签先做出响应


http://www.mrgr.cn/p/05363657

相关文章

蓝桥杯刷题之路径之谜

题目来源 路径之谜 不愧是国赛的题目 题意 题目中会给你两个数组&#xff0c;我这里是分别用row和col来表示 每走一步&#xff0c;往左边和上边射一箭&#xff0c;走到终点的时候row数组和col数组中的值必须全部等于0这个注意哈&#xff0c;看题目看了半天&#xff0c;因为…

flask_Restful数据解析参数设置

add_argument 方法参数详解 add_argument方法可以指定这个字段的名字&#xff0c;这个字段的数据类 型等&#xff0c;验证错误提示信息等&#xff0c;具体如下&#xff1a; default&#xff1a;默认值&#xff0c;如果这个参数没有值&#xff0c;那么将使用这个参数 指定的默认…

Login with Username and Password Your login attempt was not successful, try again. Reason: 坏的凭证

在互联网大厂也干过,学了很多技术,后面去了外包公司干了好多年,也没怎么学习了,更没有去研究架构之类的,到最后只剩下增删改查了。接下来花费半年时间努力站在架构角度去设计和开发,力争下半年换个30K的工作,现在行情不好,只能拿到20K,好了废话不说,写博客吧 -------…

[Java、Android面试]_13_map、set和list的区别

本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&#xff0c;后续会陆续分享出来&#xff0c;感兴趣的朋友可关注收…

JS中为什么forEach方法不能终止

forEach是我们在日常工作中经常使用到的方法,但是你有什么尝试使用forEach进行停止或终止等操作呢?今天我就遇到了这个问题,借此来剖析一下。 一、走进forEach之前对于forEach了解的并不多,只知道它可以遍历数组,如果有这么一个操作: 一个数组[0, 1, 2, 3, 4, 5],打印出…

Docker进阶:Docker-compose 实现服务弹性伸缩

Docker进阶&#xff1a;Docker-compose 实现服务弹性伸缩 一、Docker Compose基础概念1.1 Docker Compose简介1.2 Docker Compose文件结构 二、弹性伸缩的原理和实现步骤2.1 弹性伸缩原理2.2 实现步骤 三、技术实践案例3.1 场景描述3.2 配置Docker Compose文件3.3 使用 docker-…

云安全基础知识

云服务 云服务,顾名思义就是云上的服务,简单的来说就是在云厂商(例如 AWS、阿里云)那里买的服务。 目前国内云厂商有阿里云、腾讯云、华为云、天翼云、Ucloud、金山云等等,国外有亚马逊的 AWS、Google 的 GCP、微软的 Azure 等等。 oss存储桶 对象存储(Object-Based Stor…

vscode使用Runner插件将.exe文件统一放到一个目录下

找到右下角管理&#xff0c;点击扩展。 找到Code Runner插件&#xff0c;打开扩展设置。 向下翻&#xff0c;找到Executor Map&#xff0c;点击在settings.json中编辑。 在c和c的配置命令栏中增加\\\output\\即可。&#xff08;增加的目录不能自动创建&#xff0c;需要手动创建…

备考ICA----Istio实验7---故障注入 Fault Injection 实验

备考ICA----Istio实验7—故障注入 Fault Injection 实验 Istio 的故障注入用于模拟应用程序中的故障现象&#xff0c;以测试应用程序的故障恢复能力。故障注入有两种: 1.delay延迟注入 2.abort中止注入 1. 环境准备 kubectl apply -f istio/samples/bookinfo/platform/kube/…

知乎:多云架构下大模型训练,如何保障存储稳定性?

知乎,中文互联网领域领先的问答社区和原创内容平台,2011 年 1 月正式上线,月活跃用户超过 1 亿。平台的搜索和推荐服务得益于先进的 AI 算法,数百名算法工程师基于数据平台和机器学习平台进行海量数据处理和算法训练任务。 为了提高系统的易用性和灵活性,知乎实施了多云混…

SD卡备份和烧录ubuntu20.04镜像

设备及系统&#xff1a;nuc幻影峡谷工控机&#xff0c;ubuntu20.04&#xff0c;树莓派4B&#xff0c;SD卡读卡器 一、确定SD卡设备号的两种方法 方法1&#xff1a; 将有ubuntu镜像的SD卡插入读卡器&#xff0c;再将读卡器插入电脑主机&#xff0c;在 工具 中打开 磁盘&#…

[Paper Reading] LVM: Sequential Modeling Enables Scalable Learning for Large Vision Models

LVM: Sequential Modeling Enables Scalable Learning for Large Vision Models LVM: Sequential Modeling Enables Scalable Learning for Large Vision Models 时间:23.12 机构:UC Berkeley && Johns Hopkins University TL;DR 本文提出一种称为大视觉模型(LVM)的方…

【虹科干货】长文预警!使用ntopng和NetFlow/IPFIX检测Dos攻击(上)

为了和大家探讨网络安全领域中的关键问题&#xff0c;我将分两期来展示如何使用ntopng和NetFlow/IPFIX检测Dos攻击。在本篇中&#xff0c;我先简单介绍网络安全面临的挑战、为何网络流量分析在应对网络安全挑战中起重要作用&#xff0c;此外&#xff0c;我会介绍在此次检测中使…

洛谷题单指南-图的基本应用-P4017 最大食物链计数

原题链接:https://www.luogu.com.cn/problem/P4017 题意解读:食物链的顶端不会被其他生物吃,在图结构中设定为入度是0,食物链的底端不会吃其他生物,在图结构式设定为出度是0,此题就是要计算所有入度是0的点到所有出度是0的点一共有多条路径。 解题思路: 首先,来模拟一样…

ROS2从入门到精通0-4:ROS2核心架构与常用指令大全

目录 0 专栏介绍1 ROS2核心架构1.1 工作空间1.2 功能包 2 ROS2常用指令2.1 功能包相关2.2 节点运行相关2.3 话题相关2.4 参数相关2.4 录制包、播放包相关2.5 服务相关2.6 动作相关2.7 生命周期相关 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底层基本分布…

工业互联网下的增强现实

工业互联网下的增强现实 1、 概述 增强现实&#xff08;Augmented Reality&#xff0c;简称AR&#xff09;&#xff0c;增强现实技术也被称为扩增现实&#xff0c;AR增强现实技术是促使真实世界信息和虚拟世界信息内容之间综合在一起的较新的技术内容&#xff0c;其将原本在现…

[转帖]比黄金更贵的显卡,疯狂H100

https://zhuanlan.zhihu.com/p/654361974 华尔街和硅谷联袂奉上了一件震撼业界的大事:让一家创业公司拿到23亿美元的债务融资,抵押物则是当前全球最硬的通货——H100显卡。 这个大事件的主角叫做CoreWeave,主营业务是AI私有云服务,简单说就是通过搭建拥有大量GPU算力的数据…

Godot.NET C# 工程化开发(1):通用Nuget 导入+ 模板文件导出,包含随机数生成,日志管理,数据库连接等功能

文章目录 前言Github项目地址&#xff0c;包含模板文件后期思考补充项目设置编写失误环境visual studio 配置详细的配置看我这篇文章 Nuget 推荐NewtonSoft 成功Bogus 成功Github文档地址随机生成构造器生成构造器接口(推荐) 文件夹设置Nlog 成功&#xff01;Nlog.configNlogHe…

[转帖]PCIe7.0宣布即将2025推出

https://zhuanlan.zhihu.com/p/532935941 jiu导言 在2022年的PCI-SIG的开发者大会上,PCI-SIG总裁庆祝了PCI-SIG成立30周年并宣布PCIe技术的下一代技术展望,并且计划在2025年向成员发布PCIe7.0标准。而在未来3年中即将推出的PCIe7.0再次提供速度提升(相比较PCIe6.0翻倍,X16双…

SystemServer 启动流程

SystemServer 启动流程 一、介绍SystemServer 是 Android 进入 Launcher 前的最后准备,顾名思义,它提供了众多由 Java 语言编写的服务 在 Zygote 自启动过程中,参数 bool startSystemServer 为真的话,那么在 ZygoteInit.java/main() 就会调用函数 forkSystemServer() 生成 …