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

具体见: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.rhkb.cn/news/289484.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javaScript | 报错:JSX expressions must have one parent element

#错误记录&#xff1a;在做一个练习时候出现这个错误 #错误原因分析&#xff1a;在React和JSX中&#xff0c;每个JSX表达式都必须有一个父元素。这意味着你想要渲染的所有组件或元素都必须被一个单独的容器所包含。这个规则的原因是JSX最终会被编译成调用React.createElement()…

C++基本语法

C是如何工作的 文章目录 C是如何工作的1、新建Hello World工程1.1使用Visual Studio新建项目1.2 HelloWorld1.2.1 命名空间1.2.2 输出输出 1.3 注释1.4 函数1.4.1 使用有返回的函数1.4.2 自定义函数 1、新建Hello World工程 1.1使用Visual Studio新建项目 按照下面的图片&…

星云小窝项目1.0——项目介绍(一)

星云小窝项目1.0——项目介绍&#xff08;一&#xff09; 文章目录 前言1. 介绍页面2. 首页2.1. 游客模式2.2. 注册用户后 3. 星云笔记3.1. 星云笔记首页3.2. 星云笔记 个人中心3.2. 星云笔记 系统管理3.3. 星云笔记 文章展示3.3. 星云笔记 新建文章 4. 数据中心5. 交流评论6. …

PMP考试的时间有多长?

PMP考试时长为230分钟&#xff0c;即3小时50分钟&#xff0c;这3小时50分钟的时间里&#xff0c;考生需要全神贯注&#xff0c;充分展现自己的专业水平和能力&#xff0c;既是一个考验&#xff0c;也是一个挑战&#xff0c;对于每一位参加PMP考试的考生来说&#xff0c;都是一次…

浏览器导出excel

做java web项目时&#xff0c;经常遇到需要在页面上点击导出按钮&#xff0c;然后直浏览器接下载下来一个excel文档。 比如一个List<Person>的集合&#xff0c;需要将每个Person当做一行&#xff0c;输出到excel中去。其中Person实体类如下&#xff1a; import lombok.…

智驾芯片“独角兽”地平线流血冲刺上市,三年累计亏损47亿元

3月26日&#xff0c;Horizon Robotics&#xff08;下称“地平线”&#xff09;向港交所递交招股书&#xff0c;高盛、摩根士丹利、中信建投国际为其联席保荐人。 据介绍&#xff0c;成立于2015年的地平线是一家人工智能计算平台公司&#xff0c;专注于为智能汽车提供高级辅助驾…

Vivado使用(2)——综合运行与OOC

目录 一、综合运行 二、OOC 2.1 如何设置 OOC 模块 2.2 存根文件和黑盒属性 2.3 使用限制 2.4 另一种设置方法 一、综合运行 一个“运行&#xff08;run&#xff09;”是指定义和配置设计在综合过程中的各方面&#xff0c;包括&#xff1a;使用到约束&#xff0c;针对的…

蓝桥杯算法赛(二进制王国)

问题描述 二进制王国是一个非常特殊的国家&#xff0c;因为该国家的居民仅由 0 和 1 组成。 在这个国家中&#xff0c;每个家庭都可以用一个由 0 和 1 组成的字符串 S 来表示&#xff0c;例如 101、 000、 111 等。 现在&#xff0c;国王选了出 N 户家庭参加邻国的庆典…

【unity】如何汉化unity Hub

相信大家下载安装unity后看着满操作栏的英文&#xff0c;英文不好的小伙伴们会一头雾水。但是没关系你要记住你要怎么高速运转的机器进入中国&#xff0c;请记住我给出的原理&#xff0c;不懂不代表不会用啊。现在我们就来把编译器给进行汉化。 第一步&#xff1a;我们打开Uni…

Qt如何直接处理系统事件(比如鼠标事件),而不是post事件

#include <QtGui/5.15.2/QtGui/qpa/qwindowsysteminterface.h> // 方便调试事件 QWindowSystemInterface::setSynchronousWindowSystemEvents(true); 直接再 qWindowsWndProc函数中处理 通常情况: 事件被放到一个队列中

JavaEE之网络初识(网络中的一些基本概念)详解

&#x1f63d;博主CSDN主页: 小源_&#x1f63d; &#x1f58b;️个人专栏: JavaEE &#x1f600;努力追逐大佬们的步伐~ 目录 1. 前言 2. 网络中的一些基本概念 2.1 IP地址 2.2 端口号 2.3 网络协议 2.4 协议分层 2.5 封装 2.6 分用 (封装的逆向过程) 2.7 客户端 vs …

韩顺平Java | C21网络编程

1 网络的相关概念 ip地址的组成&#xff1a;网络地址 主机地址 A类&#xff1a;0 ~ 2^7-1 0 ~ 127 B类&#xff1a;128 ~ 1282^6-1 128 ~ 191 C类&#xff1a;192 ~ 1922^5-1 192 ~ 223 D类&#xff1a;224 ~ 2242^4-1 224 ~ 239 E类&#xff1a;240 ~ 2402^3-1 240 ~ 2…

正弦实时数据库(SinRTDB)的使用(5)-历史数据查询(一)

前文已经将正弦实时数据库的使用进行了介绍&#xff0c;需要了解的可以先看下面的博客&#xff1a; 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

20240321-1-AB测试面试题

AB测试面试题 1. 介绍一下ABTest的步骤 ABtest就是为了测试和验证模型/项目的效果&#xff0c;在app/pc端设计出多个版本&#xff0c;在同一时间维度下&#xff0c;分别用组成相同/相似的群组去随机访问这些版本&#xff0c;记录下群组的用户体验数据和业务数据&#xff0c;最…

力扣题库88题:合并两个有序数组(c语言)

解法&#xff1a; void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int l1m-1;int l2n-1;int l3mn-1;while(l1>0&&l2>0){if(nums1[l1]>nums2[l2]){nums1[l3--]nums1[l1--];}else{nums1[l3--]nums2[l2--];}}while(l2>0)…

化工企业能源在线监测管理系统,智能节能助力生产

化工企业能源消耗量极大&#xff0c;其节能的空间也相对较大&#xff0c;所以需要控制能耗强度&#xff0c;保持更高的能源利用率。 化工企业能源消耗现状 1、能源管理方面 计量能源消耗时&#xff0c;计量器具存在问题&#xff0c;未能对能耗情况实施完全计量&#xff0c;有…

uniapp-Form示例(uviewPlus)

示例说明 Vue版本&#xff1a;vue3 组件&#xff1a;uviewPlus&#xff08;Form 表单 | uview-plus 3.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架&#xff09; 说明&#xff1a;表单组建、表单验证、提交验证等&#xff1b; 截图&#xff1a; 示例代码 <templat…

阎淑萍:老母猪戴口罩还挺重视这张老脸啊,赵本山:我也相当副科级呀!

阎淑萍&#xff1a;老母猪戴口罩还挺重视这张老脸啊&#xff0c;赵本山&#xff1a;我也相当副科级呀&#xff01; ——小品《老拜年》&#xff08;上&#xff09;的台词 《老拜年》 是赵本山、阎淑萍、王中青、苏杰在《1993年中央电视台春节联欢晚会》上表演的小品&#xff0…

支付系列——从支付宝与银联的多年恩怨说起

备注&#xff1a;本文纯属个人观点&#xff0c;可能会有错误&#xff0c;但不接受反驳&#xff0c;哈哈&#xff01;同时&#xff0c;本文没写太多专业术语&#xff0c;只是科普和胡侃&#xff01; 2003年&#xff0c;马云刚创立淘宝网不久&#xff0c;为了能够提供更便捷的线上…