js的事件机制总结

2023-10-26

js的事件机制包括三个阶段,捕获、目标和冒泡。

1. 事件冒泡
微软提出了名为事件冒泡的事件流。事件冒泡可以形象地比喻为把一颗石头投入水中,泡泡会一直从水底冒出水面。也就是说,事件从最内层的元素开始发生,一直向上传播,直到document对象。

2. 事件捕获
网景提出另一种事件流名为事件捕获与事件冒泡相反,事件从最外层开始发生,直到最具体的元素。

上面的例子在事件捕获的概念下发生click事件的顺序应该是 document -> html -> body -> div -> p

  1. W3C事件阶段(event phase):
    当一个DOM事件被触发的时候,他并不是只在它的起源上触发一次,而是会经历三个不同的阶段。
    简而言之,事件一开始从文档的根节点流向目标对象(捕获阶段),然后在目标对向上被触发(目标阶段),之后再回溯到文档的根节点(冒泡阶段)如图所示(图片来自W3C):
    请添加图片描述
    W3C事件的传递是先捕获(从外到内)-> 目标 -> 冒泡(逆向回流,从内到外),一般情况下我们只在冒泡阶段处理回调,addEventListener有三个参数,第一个是事件类型,第二个是回调处理,第三个就是是否在捕获阶段处理

举例(不考虑IE678):

       var parent = document.getElementById("mydiv");
            parent.addEventListener("click",function(){
                console.log("parent");
            },false);
            var child = document.getElementById("child");
            child.addEventListener("click",function(){
                console.log("child");
            },false);

// true - 事件句柄在捕获阶段执行
// false- false- 默认。事件句柄在冒泡阶段执行

点击child输出:
请添加图片描述
如果把最后一个参数改成true,则输出
请添加图片描述
一般情况下我们不在捕获阶段做处理回调,只在目标阶段做处理!有些特殊情况比如禁用child的事件等需要可能会用到!event.preventDefault()禁用事件的默认处理,比如鼠标点击输入文本框文本框会获得焦点的默认处理,event.stopPropagation()阻止事件继续传递,该方法在目标处理结束后事件传递即停止,事件不会继续捕获或冒泡,这个方法可以避免多个父节点添加同一事件出现多处理的弊端!

        var parent = document.getElementById("mydiv");
            parent.addEventListener("click",function(evt){
                evt.stopPropagation();
                console.log("parent");
            },true);
            var child = document.getElementById("child");
            child.addEventListener("click",function(evt){
                console.log("child");
            },true);

点击child输出:
请添加图片描述
因为事件是在捕获阶段触发的,所以事件在parent就停止传递了,child没有接收事件

        var parent = document.getElementById("mydiv");
            parent.addEventListener("click",function(evt){
                console.log("parent");
            },false);
            var child = document.getElementById("child");
            child.addEventListener("click",function(evt){
                evt.stopPropagation();
                console.log("child");
            },false);

点击child输出
请添加图片描述
这个是在目标阶段处理的,所以parent没有接收到事件!

总结下来,js事件的三个阶段几乎都是可控的,这也给开发带来很多方便!

事件代理

事件代理用到了两个在JavaSciprt事件中两个特性:事件冒泡以及目标元素。使用事件代理,我们可以把事件处理器添加到一个元素上,等待一个事件从它的子级元素里冒泡上来,并且可以得知这个事件是从哪个元素开始的。

<div id="mydiv"><div id="child"><div id="child1">点击我!</div></div></div>
        var parent = document.getElementById("mydiv");
            parent.addEventListener("click",function(evt){
                console.log(evt.target.id);
            },false);

知道点击child1,child以及mydiv分别输出什么呢?
请添加图片描述
其实上面的事件代理解释没怎么看懂,然后自己测试了下发现了神奇的领悟,也就是说parent的事件处理只能代理其当前最深层次的child,这就是为什么点击child1,没有输出child的原因,这刚好也是事件的目标阶段的target,这是个很好的机制,假如一个parent有很多孩子都需要监听事件,那么只需给parent添加事件监听即可,通过evt.target来判断当前事件的child!这个其实在as3中经常用到,但是flash的死亡标志着以前做flash的大部分人不得不面向转行,而js恰好与flash最能完美匹配!

事件类型
之前写过一篇自定义事件的随笔,其中的createEvent方法有点意思,这里就来看下这些事件的一个大致关系

事件类型有:UI(用户界面)事件,用户与页面上元素交互时触发 ;焦点事件:当元素获得或失去焦点时触发 ; 文本事件:当在文档中输入文本时触发;键盘事件:当用户通过键盘在页面上执行操作时触发;鼠标事件:当用户通过鼠标在页面上执行操作时触发;滚轮事件:当使用鼠标滚轮(或类似设备)时触发。它们之间是继承的关系,如下图:
请添加图片描述
1.
请添加图片描述
常用:window、image。例如设置默认的图片:

<img src="photo" alt="photo.jpg" onerror="this.src='defualt.jpg'">

请添加图片描述
3.
请添加图片描述
4.
请添加图片描述
5.
请添加图片描述
6.
请添加图片描述
MouseEvent 顺序:

从元素A上方移过
mousemove -> mouseover -> mouseenter -> mousemove -> mouseout -> mouseleave ->
点击元素:
mousedown -> mousemove -> mouseup -> click

请添加图片描述

参考:
https://www.cnblogs.com/wangzisheng/p/10025550.html
https://zhuanlan.zhihu.com/p/73091706

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js的事件机制总结 的相关文章

随机推荐

  • python多线程是如何工作

    一 进程 线程 协程的相关概念 1 进程 线程 协程定义 1 进程是系统进行资源分配和调度的独立单位 2 线程是进程的实体 是CPU调度和分派的基本单位 3 协程也是线程 称微线程 自带CPU上下文 是比线程更小的执行单元 2 进程和线程的
  • 前端实习面试常考

    前端实习面试常考 持续更新中 计网 1 TCP IP四层 2 TCP UDP区别 使用场景 3 TCP三握手 四次挥手 4 输入url到界面呈现发生什么 5 HTTP2 0特性 6 HTTP HTTPS 7 localStorage ses
  • 期货反向跟单的六大境界

    五年前那会刚迈进反向跟单 现在回想起来 发觉我们当时很天真 有激情 有梦想 有活力 有野心 胸腔中充满了赤裸裸的欲望 疯狂是一件很可怕的事情 然而比疯狂更恐怖的地方在于我们身处其中而不自知 反向的第一层境界 荷尔蒙爆发 反向没出现之前 但凡
  • 问一下ChatGPT:DIKW金字塔模型

    经常看到这张DIKW金字塔模型图 还看到感觉有点过份解读的图 后面又加上了insight impact等内容 Data 是数据 零散的 无规则的呈现到人们眼前 如果你只看到这些数字 如果没有强大的知识背景 可能就是看到一些数字或符号而已 比
  • QT中资源文件resourcefile的使用,使用API完成页面布局

    QT中资源文件resourcefile的使用 之前添加图标的方法 使用资源文件的方法 创建资源文件 资源文件添加前缀 资源文件添加资源 使用资源文件中的资源 使用API完成布局 使用QHBoxLayout完成水平布局 使用QVBoxLayo
  • Latex单行/多行公式居中/左对齐

    一 单行公式居中 代码如下 示例 begin equation label eq1 y kx b end equation 输出 二 单行公式左对齐 代码如下 示例 begin flalign label eq2 y kx b end fl
  • js数组常用的方法

    js数组的相关语法 一 数组的声明 1 标准式写法 2 白话式写法 二 数组的赋值 1 在建立数组的时候直接赋值 2 根据键值进行赋值 三 数组的取值 四 concat 数组拼接方法 五 join 数组转化为字符串 六 reverse 数组
  • jenkins安装pmd对代码进行静态分析

    1 在Jenkins的插件管理中 安装PMD Plugin插件 2 在被编译的代码中 增加如下配置 1 顶级pom中 在dependencyManagement中增加对PMD插件的依赖
  • 类的构造函数,拷贝构造函数

    C Primer 类的构造函数 拷贝构造函数 在说这些内容之前 先说以下几个内容 内置类型 算术类型 整型 字符 布尔型 浮点型 和空类型 空类型不对应具体的值 仅用于一些特殊的场合 1 初始化 当对象再创建时获得了一个特定的值 我们说这个
  • linux文本处理常用命令,Linux文本处理常用命令

    Linux文本处理常用命令 grep sed printf awk cut sort 1 grep 按行查找字符 输出包含字符的行 用法grep key test txt cat test txt grep key 参数含义及示例 n输出结
  • 常用测试平台

    目录 测试用例管理 bug管理平台 代码管理平台 持续集成管理平台 流程管理平台 1 测试用例管理 jira 推荐方案 定制性很强 redmine 推荐方案 开源 活跃 定制性很强 testlink 流行的测试用例管理平台 体验不太好 其他
  • 每日一题面试题 - 持续更新

    周一到周五更新 1 undefined和null的区别 20230614 undefined 1 声明了一个变量 但没有赋值 2 对象属性没有赋值 3 调用函数没有提供相应的参数 4 函数没有返回值 默认undefined 5 undefi
  • ps如何把自己的图与样机结合_Ps如何套用样机图?

    回答 步骤1 首先你需要寻找一些方便展示作品的实体图片 你可以拍几张 也可以从各大图片素材库寻找 我们这次教程的素材是从istock图库网下载的 步骤2 还要找一些你想要展示的图片或作品 我准备在名片上展示我的名字 笔记本电脑展示我的个人网
  • 【信号去噪】基于非线性滤波器实现语音自适应去噪附matlab代码

    1 简介 2 部分代码 function A construct operator T rho y if iscolumn y 1d L length y T 1 A zeros L 1 T 1 for i 1 T 1 take the i
  • 汇编:将表格写入到指定内存空间

    代码如下 assume cs code ds data es table ss stack data segment db 1975 1976 1977 1978 1979 1980 1981 1982 1983 db 1984 1985
  • asp二进制mysql_asp.net读取显示二进制图片从MySQL数据库

    ashx页面MemoryStreamstream newMemoryStream SqlConnectionconnection newSqlConnection 省略 try connection Open SqlCommandcomma
  • k8s混合部署 ? 多套集群统一管理?

    master 和 node 操作系统和内核不一样 在 Kubernetes 中 Master 和 Node 的操作系统和内核可以不同 Master 节点主要负责集群管理和控制 而 Node 节点主要负责容器的运行和管理 因此 Master
  • 二叉树:由中序、后序求先序

    文章目录 一 题目描述 二 代码 三 代码详解 1 getPos 2 dfs函数 基本的递归思路是 以下几点需要注意 一 pos 1是中序数组左子树的右端点 二 左子树右端点 三 几种变式 四 关于post R cnt R 1为什么不直接写
  • 关于CANoe的Panel使用介绍

    关于CANoe的Panel使用介绍 一 新建步骤 使用CANoe新建Panel工程的步骤如下 打开CANoe软件 在 Project 视图中 右键单击您想要创建Panel工程的CANoe配置文件 然后选择 New Panel Project
  • js的事件机制总结

    js的事件机制包括三个阶段 捕获 目标和冒泡 1 事件冒泡 微软提出了名为事件冒泡的事件流 事件冒泡可以形象地比喻为把一颗石头投入水中 泡泡会一直从水底冒出水面 也就是说 事件从最内层的元素开始发生 一直向上传播 直到document对象