JS基础进阶3-DOM事件

news2024/9/22 15:32:14

DOM事件流

一、定义

DOM事件流指的是从页面接收事件的顺序。这个路径包括了事件的捕获阶段、目标阶段和冒泡阶段。

图片来源黑马pink老师PPT

二、事件流阶段

DOM事件流涉及三个主要阶段:

捕获阶段(Capturing Phase):

  • 事件从文档的根节点(如document对象)开始,沿着DOM树向下传播,直到到达事件的目标节点(即触发事件的元素)。
  • 在这个阶段,事件会经过目标节点的所有祖先节点,并触发这些节点上设置的捕获阶段事件监听器(如果有的话)。
  • 默认情况下,大多数浏览器不支持或不在此阶段触发事件监听器,除非在addEventListener方法中明确指定。

目标阶段(Target Phase):

  • 当事件到达目标节点时,事件在该节点上被触发,并执行该节点上绑定的事件处理函数。
  • 这个阶段没有冒泡或捕获的概念,只是简单地处理目标节点上的事件。

冒泡阶段(Bubbling Phase):

  • 事件从目标节点开始,沿着DOM树向上传播,经过所有祖先节点,直到到达文档的根节点。
  • 在这个过程中,事件会触发每个经过的节点上设置的事件监听器(默认是冒泡阶段)。
  • 如果没有在捕获阶段或目标阶段被阻止,事件将继续冒泡。

图片来源黑马pink老师

三、事件处理

在DOM事件流中,每个元素都可以有自己的事件处理程序,这些处理程序被称为事件监听器或事件处理函数。可以通过以下方式向元素添加事件监听器:

  • 对象属性绑定:如element.onclick = function() {...}。这种方式只能绑定一个事件处理函数,重复绑定会覆盖之前的函数。
  • addEventListener()方法:如element.addEventListener('click', function() {...}, [useCapture])。这种方式可以绑定多个事件处理函数,且可以指定事件是在捕获阶段还是冒泡阶段触发(通过useCapture参数,true为捕获阶段,false为冒泡阶段,默认为false)。

捕获阶段:第三个参数是true

    //DOM事件流的验证:
    //捕获顺序:window -> document -> body -> div.father -> div.son
    //冒泡顺序:div.son -> div.father -> body -> document -> window
    //先执行father的click事件,然后执行son的click事件,最后执行window的click事件。
var son=document.querySelector('.son');
son.addEventListener('click',function(e){
    alert('捕获阶段2');
},true
    );
    var father=document.querySelector('.father');
    father.addEventListener('click',function(e){
        alert('捕获阶段1');
    },true);

冒泡阶段:第三个参数是false或者省略

   //冒泡阶段
  var son=document.querySelector('.son');
son.addEventListener('click',function(e){
    alert('son');
},false
    );
    var father=document.querySelector('.father');
    father.addEventListener('click',function(e){
        alert('father');
    },false);
    document.addEventListener('click',function(){
        alert('document');
    });

 四、阻止事件冒泡

在事件冒泡的过程中,可以通过调用事件对象上的stopPropagation()方法来阻止事件继续向上冒泡。此外,在Internet Explorer中,还可以通过设置事件对象的cancelBubble属性为true来达到同样的效果。

五、应用与注意事项

1. JS代码中只能执行捕获或者冒泡其中的一个阶段。
2. onclick 和attachEvent 只能得到冒泡阶段。
3. addEventListener (type, listener [, useCapture] )第三个参数如果是true ,表示在事件捕 获阶段调用事件处理程序;如果是false (不写默认就是false ) , 表示在事件冒泡阶段调用事件处理程序。
4.实际开发中我们很少使用事件捕获,我们更关注事件冒泡。
5.有些事件是没有冒泡的,比如onblur、onfocus、 onmouseenter、 onmouseleave

事件对象

一、定义

  •  et就是一个对象,包含了事件的所有信息,包括事件类型、事件源、事件目标等。当形参来看
  •   事件对象有了事件才会存在,否则不存在
  • 事件对象可以自己命名event \e\eve
  • IE678通过window.event获取事件对象
  • 兼容性写法:e=e||window.e;
    <div>111</div>
    <script>
        var div=document.querySelector("div");
        div.addEventListener("click", function(e){
            div.style.backgroundColor="blue";
            console.log(e);
        });
    </script>

输出: 

 

二、事件对象常见的方法和属性

常见属性
常见属性说明
type返回事件的类型,如click、keydown、mouseover等
target返回触发事件的元素
currentTarget返回其事件监听器触发该事件的元素
eventPhase返回事件传播的当前阶段,返回的值含义(0,表示事件不在传播过程中)、(1,表示事件正在捕获阶段传播)、(2,表示事件到达目标元素)、(3,表示事件正在冒泡阶段传播)
bubbles返回一个布尔值,指示事件是否冒泡
cancelable返回一个布尔值,表示事件是否可以取消只有可以取消的事件(如submit事件)的preventDefault()方法才会起作用
timeStamp返回事件发生的时间戳(自1970年1月1日00:00:00 UTC起计算的毫秒数)
clientX/clientY返回鼠标事件发生时,鼠标指针相对于浏览器窗口可视区的水平/垂直坐标
pageX/pageY返回鼠标事件发生时,鼠标指针相对于整个文档的水平/垂直坐标(包括滚动的偏移量)

代码示例

       div.addEventListener("click", function(e){
            div.style.backgroundColor="blue";
            console.log(e);
            console.log(e.target);
            console.log(this);
            console.log(e.type);
            console.log(e.eventPhase);
        });
常见方法
方法说明
preventDefault()阻止事件的默认行为,例如,阻止链接的默认跳转行为或表单的默认提交行为
stopPropagation()阻止事件进一步传播(冒泡或捕获)
stopImmediatePropagation():除了调用stopPropagation()的方法外,stopImmediatePropagation还会阻止相同事件的其他监听器被调用(如果它们绑定在当前元素上)
composedPath()返回一个数组,包含事件传播路径上的所有DOM节点
1.preventDefault() 方法示例
<form id="myForm" action="/submit-form">  
  <input type="submit" value="提交">  
</form>  
  
<script>  
  document.getElementById('myForm').addEventListener('submit', function(event) {  
    event.preventDefault(); // 阻止表单的默认提交行为  
    console.log('表单提交被阻止');  
  });  
</script>
2. stopPropagation() 方法示例
<div id="parent" style="padding: 20px; border: 1px solid #000;">  
  <button id="child">点击我</button>  
</div>  
  
<script>  
  document.getElementById('parent').addEventListener('click', function(event) {  
    console.log('Parent clicked');  
  });  
  
  document.getElementById('child').addEventListener('click', function(event) {  
    event.stopPropagation(); // 阻止事件冒泡  
    console.log('Child clicked');  
  });  
</script>
拓展this和target的区别

1.this返回的是绑定是按的对象(元素)      ///    e.target返回的是触发事件的对象(元素)

2.代码示例

        var ul=document.querySelector('ul');
        ul.addEventListener('click', function(e){
            //this指向ul
            console.log(this);
            //e.target指向li触发事件的对象
            console.log(e.target);
            console.log(e.target.tagName);
            console.log(e.target.parentNode);
            console.log(e.target.nextSibling);
        })

结果:

事件委托 

事件委托的步骤
  • 确定事件绑定在哪个父元素上:这个父元素需要包含所有目标子元素,且最好在DOM结构中位于一个较低层次
  • 编写事件处理函数:在这个函数中,通过event.target属性来获取实际触发事件的元素(即事件的目标元素)。event.target始终指向触发事件的元素,即使在事件冒泡过程中。
  • 检查event.target是否符合预期:在事件处理函数中,可以通过比较event.target的某些属性(如id、class、tagName等)来确定是否需要对该事件进行响应。
  • 执行相应的操作:如果event.target符合条件,则执行相应的操作。

代码

    <ul>
        <li>希望在于自己</li>
        <li>希望在于自己</li>
        <li>希望在于自己</li>
        <li>希望在于自己</li>
    </ul>
    <script>
        var ul=document.querySelector("ul");
        ul.addEventListener("click",function(e){
            //判断是否为li标签
            //toLowerCase() 用于将字符串中的所有大写字母转换为小写字母
            if(e.target.tagName.toLowerCase() === "li"){
                e.target.style.backgroundColor = "pink";
                alert("点击了"+e.target.innerHTML);
            }
        });
    </script>

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

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

相关文章

QtChart1-基础入门

Qt Charts概述 Qt Charts模块是一组易于使用的图标组件&#xff0c;它基于Qt的Graphice View架构&#xff0c;其核心组件是QChartView和QChart。QChartView的父类是QGraphicsView&#xff0c;就是Graphics View架构中的视图组件&#xff0c;所以&#xff0c;QChartView是用于显…

Apollo9.0 PNC源码学习之Planning模块—— Lattice规划(六):横纵向运动轨迹评估

参考文章: (1)Apollo6.0代码Lattice算法详解——Part6:轨迹评估及碰撞检测对象构建 (2)自动驾驶规划理论与实践Lattice算法详解 0 前言 横纵向运动轨迹的评估,主要通过构建定点巡航和定点停车两个场景下,对纵向运动参考速度、加速度、加加速度的大小进行检验和过滤,然…

Vue3源码调试-第一篇

前言 相信大家在前端从业生涯中都会被问到过&#xff0c;有了解过Vue源码吗&#xff1f;我是没有的&#xff0c;所以今天就来读好吧&#xff0c;浅浅读一下&#xff0c;顺便记录一下。 那究竟怎么读&#xff0c;从哪里读&#xff0c;我就不啰嗦了&#xff0c;直接给大家一个链…

python dash框架 油气田可视化软件设计文档

V1.1:机器学习框架(神经网络) 时间范围优化 表格布局优化 添加前端设计元素布局 V1.0&#xff1a;基础布局和对应计算函数 要求 首先第一部分是通过神经网络预测天然气流量&#xff0c;其中输入开始时间和截止时间是为了显示这一段时间内的天然气流量预测结果 第二部分&…

小型空气净化器可以除猫毛吗?宠物空气净化器评测推荐

前段时间我有个病人&#xff0c;诊断出来肺结节&#xff0c;他第一反应就是说他家养着好几只猫&#xff0c;会不会是吸入宠物毛发导致的肺结节。有些结节确实跟宠物有关系&#xff0c;如果是对毛发过敏、或者是对排泄物过敏&#xff0c;养宠物就会增加患结节的概率。不过就算是…

推荐一款AI智能编程助手CodeGeeX

最近&#xff0c;使用了一款AI智能编程助手CodeGeeX&#xff0c;感觉还不错&#xff0c;推荐给大家。 官网地址&#xff1a;https://codegeex.cn/ 一、安装教程 IDEA中安装插件&#xff1a;https://codegeex.cn/downloadGuide#idea VSCode中安装插件&#xff1a;https://codege…

八股(5)——数据库

八股&#xff08;5&#xff09;——数据库 4.1 数据库基础什么是数据库, 数据库管理系统, 数据库系统, 数据库管理员?什么是元组, 码, 候选码, 主码, 外码, 主属性, 非主属性&#xff1f;主键和外键有什么区别?为什么不推荐使用外键与级联&#xff1f;什么是 ER 图&#xff1…

TD学习笔记————中级教程总结(中)

目录 四、生成艺术 问题: CHOP TO放置后直接报错 附着不上线 五、Python Lists 与 Python Dictionaries 问题: 使用for的格式要求 显示numRows错误 List中表格定义报错 六、Replicate 与 Instance 问题: 传递处理好的噪音后不变化 Renderpass区分线和字时不起作用…

安科瑞智能物联网关:重塑能源管理新纪元,远程智控尽在“掌”握

在数字化转型浪潮中&#xff0c;能源管理与工业自动化领域正经历着前所未有的变革。安科瑞智能物联网关-智能通信管理机不仅重新定义了智能监控与保护装置的通信管理模式&#xff0c;更为能源数据采集与远程控制提供了前所未有的高效解决方案。 安科瑞智能物联网关&#xff0c…

qt开发环境搭建Qt Creator并创建Demo项目

一 Qt Creator工具下载&#xff1a;工具下载链接&#xff1a; Index of /archive/online_installers/4.8 (qt.io) 下载后点击安装&#xff0c;没有账号得先注册一个账号&#xff0c;如下图&#xff0c;然后点击下一步 随便填点&#xff0c;我填"abc"&#xff0c;然…

Unity读取Android本地图片

unity读取Android本地图片 一、安卓读取路径 安卓路径&#xff1a;“file:///storage/emulated/0/”自己图片的路径 例&#xff1a;“file:///storage/emulated/0/small.jpg” 二、unity搭建 使用UI简单搭个界面 三、新建一个脚本 代码内容如下 using System.Collectio…

Android自定义简单TextView

自定义属性 <declare-styleable name"TextView"><!--name 属性名称format 格式&#xff1a;string 文字 color颜色dimension 宽高 字体大小 integer数字reference 资源引用(drawable)--><attr name"YiRanText" format"string"/&…

Sora:视频生成模型

​2024年2月16日&#xff0c;OpenAI 在其官网上面正式宣布推出文本生成视频的大模型 Sora: openai.com/sora Sora的能力 Sora是生成视频为主要能力的模型&#xff0c;能够&#xff1a; 1. 文/图生成视频 openai sora文生视频案例&#xff1a; Prompt: Historical footage of…

自动化立体仓库设施及设备:汇总总结

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载。 这份文件是关于自动化立体仓库的详细介绍&#xff0c;包括其分类、系统组成、基本设施…

SylixOS 网卡混杂模式和组播模式

基本概念 混杂模式&#xff1a; Promiscuous mode&#xff0c;是电脑网络中的术语。是指一台机器的网卡能够接收所有经过它的数据流&#xff0c;而不论其目的地址是否是它。 一般计算机网卡都工作在非混杂模式下&#xff0c;此时网卡只接受来自网络端口的目的地址指向自己的…

《征服数据结构》LRU缓存

摘要&#xff1a; 1&#xff0c;LRU的介绍 2&#xff0c;LRU元素的添加 3&#xff0c;LRU元素的读取 4&#xff0c;LRU完整代码实现 1&#xff0c;LRU的介绍 LRU(Least Recently Used)最近最少使用&#xff0c;它是一种缓存淘汰策略。也就是说在缓存容量满的时候&#xff0c;我…

vue2 part2

数据代理 通过defineProperty里面传入obj2和x&#xff0c;然后get和set下读取接收下然后再接收set中给对象x用value接收下&#xff0c;这样就能两个数据读取和接收了 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>何…

printk 操作等级:修改系统日志等级

这是系统日志的等级&#xff0c;在kern_levels.h文件里面 这是printk 函数前面部分先消息等级&#xff0c;中间部分就是&#xff0c;应用层调的printf的格式化字&#xff0c;后面部分就是可变参数 所以信息的等级大于终端的等级才会被打印&#xff0c;命令&#xff0c;cat /pro…

远程连接vscode无法转到定义

遇到用vscode打开远程服务器运行代码的过程中&#xff0c;无法利用插件跳转到定义&#xff08;ctrl鼠标左键///或者F12&#xff09; 问题可能出在两个地方&#xff0c;一个是插件&#xff0c;找到python插件 点击扩展设置&#xff0c;找到language server设置 这里选中pylance…

springboot调用sap接口传输数据,RFC协议接口调用,包含linux,windows部署

背景&#xff1a;我这边需要将一串数组写入到sap系统中&#xff0c;原本希望sap能提供rest形式接口&#xff0c;可惜sap开发那边说sap对外都是rfc接口&#xff0c;现在记录一下sap接口对接&#xff0c;给其他小伙伴提供点经验。 1、首先必须有对应的原料&#xff0c;驱动jar包…