JavaScript-关于事件、事件流(捕获、冒泡)、事件源、常用事件

1.如何注册事件(如何绑定事件)

​ 何为注册事件,就是给元素添加事件,其方式有传统注册事件、方法监听注册事件。

  • 0、1级事件(传统注册事件)不允许多个响应程序

    我们在元素内或js内使用on的方式就是传统注册事件,这种形式添加的事件叫DOM 0级事件(DOM L0 事件),如onclick、onblur等

    <div id="box" onclick="fn()"></div>
    <script>
    // js里面也可以注册事件let box = document.getElementById("box")box.onclick = function (){console.log("注册click事件成功1")
    }box.onclick = function (){console.log("注册click事件成功2")
    }//这里只会打印"注册click事件成功2" ,因为不允许多个响应程序,后面会覆盖前面的事件
    </script>
    
  • 2级事件(方法监听注册事件)允许多个响应程序,事件触发时依次调用

  • 方法1:元素.addEventListener:

    // IE9之前的IE不支持此方法
    元素.addEventListener('事件名', 事件响应程序(函数)callback,useCapture)
    // useCapture:可选参数,是一个布尔值,默认是 false
    // true 是捕获阶段 false是冒泡阶段 事件触发会依据事件流的顺序调用
    // 例如以下 
    box.addEventListener('click', function () {// 给box添加点击事件
    })
    // 允许多个响应程序,事件触发时依次调用
    box.addEventListener('click', function () {console.log('1')
    })
    box.addEventListener('click', function () {console.log('2')
    })//这里会依次打印1、2
    
  • 方法2:元素.attachEvent( on事件名, 响应程序 )

    // IE9之前的浏览器支持
    元素.attachEvent( on事件名, 事件响应程序(函数)callback )
    box.attachEvent('onclick', function () {})
    
2.如何删除事件(如何解除绑定事件)

用哪种方式添加的事件,我们只能用对应方式来删除,无法混用,而且要注意是否注册的是匿名函数,这种事件无法删除。

  • 0、1级事件的删除方法:

    元素.on事件名 = null  或者 = undefined
    box.onclick = null  或者  box.onclick = undefined
    
  • 2级事件的删除方法:

    addEventListener的删除:

    元素.removeEventListener('事件名', 函数名)
    // 匿名函数例子
    box.addEventListener('click', function () {console.log('1')
    })
    // 非匿名
    function fn(){}
    box.addEventListener('click', fn)
    // 删除例子
    box.removeEventListener('click',fn)
    

    attachEvent的删除

    元素.detachEvent('on事件名', 函数名)
    
3.什么是DOM事件流

在这里插入图片描述

  • 事件流:当一个事件触发后,它其实经历了从上(捕获阶段)到下(事件目标),又从下(事件目标)到上(冒泡阶段)的流动过程,这就称之为事件流

    • 事件冒泡默认存在的,事件捕获要写特殊代码才能看到,如下。

      • 例如:addEventListener的第三个参数写为true就是事件捕获,所以前面写的addEventListener里面提到的就是这里
    • 不管是捕获、冒泡,都会触发同名事件

    • 事件流如果不写特殊代码,会经历完整的事件流。

      <div id="div1" style="background: blue;width: 100px; height: 100px;"><div id="div2" style="background: red;width: 70px; height: 70px;"><div id="div3" style="background: yellow;width: 50px; height: 50px;"></div></div>
      </div>
      <script type="text/javascript">var oDiv1 = document.getElementById('div1'),oDiv2 = document.getElementById('div2'),oDiv3 = document.getElementById('div3');oDiv1.addEventListener('click', showBlue, true);
      oDiv2.addEventListener('click', showRed, false);
      oDiv3.addEventListener('click', showYellow, true);
      function showBlue(){ //蓝 alert("blue");}
      function showRed(){ //红 alert("red"); }
      function showYellow(){//黄 alert("yellow");}// 结果“blue”,“yellow”,“red”
      // true 是捕获阶段,依据事件流是先执行,所以先出蓝 黄,false是冒泡阶段,所以最后出红
      </script>
      
4.什么是事件对象

​ 事件对象也是一个对象,里面保存了事件触发时的相关信息,event 对象代表事件的状态,比如键盘按键的状态、鼠标的位置、鼠标按钮的状态。

比如:键盘触发的事件,会得到键盘相关信息,如enter键

  • 怎么获取事件对象?

    • 如事件绑定的函数里写一个形参event/e、或者写window.event
  • 事件对象的兼容性方案(IE6~8 和IE8之后都可以使用)?

    • e = e || window.event
    eventTarget.onclick = function(event) {
    // 这个 event 就是事件对象}
    eventTarget.addEventListener('click', function(event) {
    }// 形参是可变的,随便起名字,但一般用event、e、ev
    
  • 怎么获取事件源?

    • 事件对象.target || e.target是我们事件触发的元素,比如我点body就是body,我点div就点的那个div;
    • this 当前事件调用函数的绑定元素,this是注册当前事件的父元素;
事件对象常见的属性方法说明
e.targer返回触发事件的对象 标准
e.type返回事件的类型 比如click mouseover 不带on
e.cancelBubble该属性阻止冒泡 非标准 ie6-8使用
e.returnValue该属性阻止默认事件(默认行为) 非标准 ie6-8使用 比如不让链接跳转
e.preventDafault() 阻止事件默认行为该方法阻止默认事件(默认行为) 标准 比如不让(a标签)链接跳转
e.stopPropagation()阻止冒泡标准,当父子有同名事件,为了不相互影响时可以使用
e.currentTarget与this一样,非标准 ie6-8使用
5.阻止事件冒泡、事件捕获(阻止事件流)
  • e.stopPropagation() (IE9后支持)
    • 可以阻止冒泡、捕获阶段
  • e.cancelBubble = true(IE9前支持)
    • IE9之前没有事件捕获(因为IE9之前无法用addEventListener)
// 兼容性解决方案box.addEventListener('click', function(e) {alert('box');
// 兼容性写法
if (e && e.stopPropagation) {e.stopPropagation(); //适用于ie9后
} else {window.event.cancelBubble = true; // 适用于ie678 
}
}, false);
工作实际案例场景:1、登录页面,登录弹出框与后面父元素背景的点击事件冲突时;2、移动端,某个弹出框,不希望点击到阴影部分的功能;3、拓扑页面存在点击事件,需要在上层弹出某个弹框,可以拖拽改变页面大小; 
6.事件委托(事件代理、事件委派)

把给每个子元素单独设置事件监听器的需求,改成事件监听器设置在其父元素上,利用冒泡原理代理到子元素上。

  • 好处:减少绑定事件的次数,提高性能(只操作了一次 DOM ,提高了程序的性能),减少代码冗余,即使新增的子元素也享有事件监听器;

  • 需求:给li添加点击事件,并且获得里面的key值

    解决办法1:给每个li添加点击事件,这种方法代码太过冗余

    优化解决办法:把事件委托给ul元素,给它添加点击事件方法,利用事件冒泡

  • <ul><li key="1">点我点我宝贝</li><li key="2">点我点我宝贝</li><li key="3">点我点我宝贝</li><li key="4">点我点我宝贝</li><li key="5">点我点我宝贝</li><span key="6">不是li</span><span key="7">不是li</span>
    </ul>
    <script>let ul = document.querySelector('ul');ul.addEventListener('click',function(e){if(e.target.tagName === 'LI'){ // 判断是不是li标签return e.target.getAttribute('key')}})
    </script>
    

7.常用的事件

①鼠标事件
鼠标事件触发条件
onclick鼠标点击左键触发
onmouseover鼠标经过触发
onmouseout鼠标离开触发
onfocus获取鼠标焦点触发
onblur失去鼠标焦点触发
onmousemove鼠标移动触发
onmouseup鼠标弹起触发
onmousedown鼠标按下触发
contextmenu鼠标右键触发(e.preventDefault() 阻止弹出右键菜单,场景:取消默认的上下文菜单,加入自己的菜单;复制网页内容功能屏蔽)
selectstart鼠标选择开始(e.preventDefault() ;场景:复制网页内容功能屏蔽,禁止用户选中)
MouseEvent鼠标事件对象说明(像素距离)
e.clientX鼠标相对于浏览器窗口可视区的X坐标(变)
e.clientY鼠标相对于浏览器窗口可视区的Y坐标(变)
e.pageX鼠标相对于页面的X坐标 IE9+支持(doc)
e.pageY鼠标相对于页面的Y坐标 IE9+支持(doc)
e.screenX鼠标相对于电脑屏幕的X坐标
e.screenY鼠标相对于电脑屏幕的Y坐标
②键盘事件

使用addEventListener 不需要加 on

键盘事件触发条件
onkeydown/keydown按下时触发,不区分大小写字母,任何键
onkeyup/keyup松开时触发,不区分大小写字母,任何键
onkeypress/keypress按下时触发,介于 keydown 和 keyup之间,(a-z0-9回车和空格),会区分大小写,不识别功能键
键盘事件对象说明
keyCode返回该键的ASCII值

在这里插入图片描述

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

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

相关文章

【论文阅读笔记】Explicit Visual Prompting for Low-Level Structure Segmentations

1.介绍 Explicit Visual Prompting for Low-Level Structure Segmentations 低级结构分割的显式视觉提示 2023年发表在IEEE CVPR Paper Code 2.摘要 检测图像中低级结构&#xff08;低层特征&#xff09;一般包括分割操纵部分、识别失焦像素、分离阴影区域和检测隐藏对象。虽…

有道翻译相关介绍

官网&#xff1a;有道翻译 (youdao.com) 翻文本与文档 长短句实时翻译&#xff0c;109种语言互译 支持医学、计算机、金融经济等专业领域翻译 提供42个专业术语库&上传自定义术语库 翻词汇 实时收录最新词汇&#xff0c;8种语言互译 完整收录新牛津、柯林斯、韦氏等权威…

贪心算法(算法竞赛、蓝桥杯)--修理牛棚

1、B站视频链接&#xff1a;A27 贪心算法 P1209 [USACO1.3] 修理牛棚_哔哩哔哩_bilibili 题目链接&#xff1a;[USACO1.3] 修理牛棚 Barn Repair - 洛谷 #include <bits/stdc.h> using namespace std; const int N205; int m,s,c,ans; int a[N];//牛的位置标号 int d[N…

基于springboot实现街球社区网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现街球社区网站系统演示 摘要 本文主要讲述了基于SpringBootVue模式的街球社区网站的设计与实现。这里所谓的街球社区网站是通过类似于百度贴吧之类的网上论坛使得所有的街球爱好者有一个可以互相交流的平台,并使所有用户可以在社区进行教学视频的观看以及相关…

【LeetCode】一周中的第几天+ 一年中的第几天

2023-12-30 文章目录 一周中的第几天方法一&#xff1a;模拟思路步骤 方法二&#xff1a;调用库函数方法三&#xff1a;调用库函数 [1154. 一年中的第几天](https://leetcode.cn/problems/day-of-the-year/)方法一&#xff1a;直接计算思路&#xff1a; 方法二&#xff1a;调用…

智慧灌区项目案例(甘肃省兰州市某重点灌区)

​甘肃省兰州市某重点灌区自上个世纪80年代建成后,灌溉面积达到30万亩,对推动当地农业发展发挥了重要作用。但长期以来,该灌区的水利管理仍主要依靠人工统计记录,缺乏实时监测和精细化管理。为实现灌区管理的现代化升级,甘肃水利局委托星创易联公司设计实施水利信息化项目。 项…

MAC M1 安装mongodb7.0.5 版本

1、进入官网 Download MongoDB Community Server | MongoDBDownload MongoDB Community Server non-relational database to take your next big project to a higher level!https://www.mongodb.com/try/download/community 2、选择版本 3、下载后解压 放到 /usr/local 并修改…

HarmonyOS—端云一体化组件

概述 DevEco Studio还为您提供多种端云一体化组件。集成端云一体化组件后&#xff0c;您只需进行简单配置即可向应用用户提供登录、支付等众多功能。 登录组件 您可使用端云一体化登录组件向应用用户提供登录和登出功能&#xff0c;目前支持帐号密码登录、手机验证码登录、以…

css【详解】—— 圣杯布局 vs 双飞翼布局 (含手写清除浮动 clearfix)

两者功能效果相同&#xff0c;实现方式不同 效果预览 两侧宽度固定&#xff0c;中间宽度自适应&#xff08;三栏布局&#xff09;中间部分优先渲染允许三列中的任意一列成为最高列 圣杯布局 通过左右栏填充容器的左右 padding 实现&#xff0c;更多细节详见注释。 <!DOCTYP…

【Linux C | 网络编程】getaddrinfo 函数详解及C语言例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

数据库进阶——如何提升数据库的安全性,以MySQL和Redis加固为例

目录 引出数据库加固加固思路MySQLRedis Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 数据库进阶——如何提升数据库的安全性&#xff0c;以MySQL和Redis加固为例 数据库加固 加固思路 账号配置 应按照用户分配账号&…

Linux进阶——系统安全,重要文件,加固系统的相关配置

目录 引出Linux系统安全一、重要文件二、帐户口令三、权限管理四、日志配置五、服务安全六、其他配置 缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Linux进阶——系统安全&#xff0c;重要文件&#xff0c;加固系统的相关配置 Linux系统安…

C习题002:澡堂洗澡【仅供参考】

问题 输入样例 在这里给出一组输入。例如&#xff1a; 2 5 1 3 3 2 3 3 输出样例 在这里给出相应的输出。例如&#xff1a; No代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB 代码 #include<stdio.h> int main() {int N,W,s,t,p;int arr_s[…

Spring 学习记录

Spring 学习记录 1. Spring和SpringFrameWork1.1 广义的Spring2.1 狭义的Spring2.3 SpringFrameWork / Spring框架图 2. Spring IOC容器(即上图中的Core Container)2.1 相关概念 (IOC DI 容器 组件)2.2 Spring IOC容器的作用2.3 Spring IOC容器接口和具体实现类 3. Spring IOC …

TDengine 研发分享:利用 Windbg 解决内存泄漏问题的实践和经验

内存泄漏是一种常见的问题&#xff0c;它会导致程序的内存占用逐渐增加&#xff0c;最终导致系统资源耗尽或程序崩溃。AddressSanitizer (ASan) 和 Valgrind 是很好的内存检测工具&#xff0c;TDengine 的 CI 过程就使用了 ASan 。不过这次内存泄漏问题发生在 Windows 下&#…

新品齐发!小牛电动打造全场景高端化产品阵列!

2 月 29 日&#xff0c;全球智能城市出行品牌小牛电动发布“新世代性能旗舰”电摩NX、电自NXT&#xff0c;以及“全场景智驾越野电摩”X3三款新品。同时&#xff0c;与知名体育电竞俱乐部——JDG京东电子竞技俱乐部携手&#xff0c;打造“英雄的联盟”超级形象&#xff0c;引领…

学习大语言模型(LLM),从这里开始

在见识了ChatGPT的各种强大能力后&#xff0c;不少 NLP一线从业人员很自然地想到&#xff0c;以后开发者只要借助 ChatGPT&#xff0c;就可以做到现在大部分NLP工程师在做的事&#xff0c;比如文本分类、实体抽取、文本推理等。甚至随着大语言模型&#xff08;largelanguagemod…

【JVM篇】什么是运行时数据区

文章目录 &#x1f354;什么是运行时数据区⭐程序计数器⭐栈&#x1f50e;Java虚拟机栈&#x1f388;栈帧的内容 &#x1f50e;本地方法栈 ⭐堆⭐方法区 &#x1f354;什么是运行时数据区 运行时数据区指的是jvm所管理的内存区域&#xff0c;其中分为两大类 线程共享&#xf…

2024亚马逊全球开店注册前需要准备什么?

在2023年出海四小龙SHEIN、Temu、速卖通AliExpress、TikTok Shop快速增长扩张&#xff0c;成为了中国跨境卖家“逃离亚马逊”的新选择。但是&#xff0c;跨境电商看亚马逊。当前&#xff0c;亚马逊仍然是跨境电商行业的绝对老大&#xff0c;占有将近70%成以上的业务份额。 作为…

【电商干货】5分钟了解电商数据API测试完整流程,建议收藏!可获取免费测试key!

电商API是什么&#xff1f; API是application programming interface&#xff08;应用程序接口&#xff09;的简称&#xff0c;是一些预先定义的函数。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部…