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.mzph.cn/news/714979.shtml

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

相关文章

#WEB前端(CSS基础)

1.实验&#xff1a;HTML是网页骨架&#xff0c;CCS是网页装修 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; style 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"view…

学习笔记-李沐动手学深度学习(七)(19-21,卷积层、填充padding、步幅stride、多输入多输出通道)

总结 19-卷积层 【补充】看评论区建议的卷积动画视频 数学中的卷积 【链接】https://www.bilibili.com/video/BV1VV411478E/?fromsearch&seid1725700777641154181&vd_sourcee81e116c4ffe5e79d4bc44738263eda4 【可判断是否为卷积的典型标志】两个函数中自变量相加…

Salesforce CPQ - 02 - Quote Price

最近又有客户来咨询学习Salesforce CPQ&#xff0c;所以本人总结了下近几年CPQ培训的一些实际案例拿出来分享给大家&#xff1b; 再次介绍下本人是一位Salesforce十多年的从业者。 先来介绍下Salesforce的价格体系&#xff0c;再介绍下各个Product Price是如何配置及使用的&a…

测试需求平台8-Arco组件实现产品增改需求

✍此系列为整理分享已完结入门搭建《TPM提测平台》系列的迭代版&#xff0c;拥抱Vue3.0将前端框架替换成字节最新开源的arco.design&#xff0c;其中约60%重构和20%新增内容&#xff0c;定位为从 0-1手把手实现简单的测试平台开发教程&#xff0c;内容将囊括基础、扩展和实战&a…

在什么时候企业档案才会发生调整

档案在企业中通常会调整在以下几个时刻&#xff1a; 1. 入职时&#xff1a;员工入职时&#xff0c;企业会要求员工提供个人档案&#xff0c;包括身份证件、学历证明、工作经历等相关文件。 2. 离职时&#xff1a;员工离职时&#xff0c;企业会整理员工的离职档案&#xff0c;包…

JDBC

概念&#xff1a; JDBC 就是使用Java语言操作关系型数据库的一套API 全称&#xff1a;( Java DataBase Connectivity ) Java 数据库连接。 JDBC的本质&#xff1a; 官方&#xff08;sun公司&#xff09;定义的一套操作所有关系型数据库的规则&#xff0c;即 接口各个数据库厂…

Filebeat将csv导入es尝试

一、安装 在docker中安装部署ELKfilebeat 二、主要配置 - type: log # Change to true to enable this input configuration. enabled: true # Paths that should be crawled and fetched. Glob based paths. paths: - /home/centos/pip_v2.csv #源路径 #…

Sqli-labs靶场第15关详解[Sqli-labs-less-15]

Sqli-labs-Less-15 #自动化注入-SQLmap工具注入 SQLmap用户手册&#xff1a;文档介绍 - sqlmap 用户手册 由于这题是post请求&#xff0c;所以先使用burp进行抓包&#xff0c;然后将数据包存入txt文件中打包 用-r 选择目标txt文件 python sqlmap.py -r data.txt -current-db…

Visual Studio C++项目远程断点调试客户现场程序方法

前言 程序开发一个很常见的场景&#xff0c;就是程序在自己本地部署调试明明一点问题都没有&#xff0c;但是部署到客户现场就问题百出&#xff0c;要调试起来还很困难&#xff0c;在自己本地也没有条件复现&#xff0c;很多时候只能靠日志一点点排查和猜测&#xff0c;耗费大…

我在代码随想录|写代码Day31 | 贪心算法总结篇 | 贪心终结一题

&#x1f525;博客介绍&#xff1a; 27dCnc &#x1f3a5;系列专栏&#xff1a; <<数据结构与算法>> << 算法入门>> << C项目>> &#x1f3a5; 当前专栏: << 算法入门>> 专题 : 数据结构帮助小白快速入门算法 &#x1f4…

AJAX实例

AJAX - Asynchronous JavaScript and XML - 异步的JavaScript与XML&#xff0c;不是一门新技术&#xff0c;只是一个新的术语。&#xff08;老技术新玩法&#xff09; - 使用AJAX&#xff0c;网页能够将增量更新呈现在页面上&#xff0c;而不需要刷新整个页面。 - 虽然X代表…

力扣1892 页面推荐Ⅱ

力扣1892&#xff0c;页面推荐Ⅱ&#xff0c;为一个社交媒体网站实施一个页面推荐系统。如果页面被user_id的 至少一个朋友喜欢 &#xff0c;而 不被user_id喜欢 &#xff0c;你的系统将 推荐 一个页面到user_id。 目录 题目描述 解题思路 完整代码 优化 题目描述 表&…

鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?

“2024年是原生鸿蒙的关键一年&#xff0c;我们要加快推进各类鸿蒙原生应用的开发&#xff0c;集中打赢技术底座和三方生态两大最艰巨的战斗。”这是余承东在新年信中表达的决心。 随后在1月18日举行的鸿蒙生态千帆启航仪式上&#xff0c;华为宣布 HarmonyOS NEXT 鸿蒙星河版系…

Linux下进程相关概念详解

目录 一、操作系统 概念 设计操作系统的目的 定位 如何理解“管理” 系统调用和库函数概念 二、进程 概念 描述进程—PCB&#xff08;process control block&#xff09; 查看进程 进程状态 进程优先级 三、其它的进程概念 一、操作系统 概念 任何计算机系统都包…

【Easyx】easyx从入门到精通 — 初步入门

easyx 初步入门 1 安装easyx图形库2 如何使用Easyx3 效果初试4 基本图形绘制4.1 绘制点4.2 绘制直线4.3 绘制圆形4.4 绘制矩形4.5 绘制椭圆4.6 绘制圆角矩形4.7 绘制扇形 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇…

算法入门-二分搜索(长期更新)

文章目录 情景一 : 二分查找情景二 : 找出一个 > num 的最左侧的位置情景三 : 找出一个 < num 的最右侧的位置leetcode 162 :寻找峰值leetcode 69 : x 的平方根 首先来简介一下二分搜索算法,二分搜索是一种每次砍半的算法,最经典的案例当然是我们的二分查找算法,但是大部…

【JAVA重要知识 | 第一篇】一篇文章读懂HashMap(存储、扩容、初始化过程)

文章目录 1.一篇文章读懂HashMap&#xff08;存储、扩容、初始化过程&#xff09;1.1HashMap简介1.1.1特点1.1.2优点1.1.3缺点 1.2深入解读HashMap1.2.1常用常量和变量&#xff08;1&#xff09;常用常量&#xff08;2&#xff09;常用变量 1.2.2存储过程&#xff08;1&#xf…

诊所门诊电子处方软件操作教程及试用版下载,医务室处方笺管理系统模板教程

诊所门诊电子处方软件操作教程及试用版下载&#xff0c;医务室处方笺管理系统模板教程 一、前言 以下软件程序教程以 佳易王诊所电子处方软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 如上图&#xff0c;点击基本信息设置——处方配…

Python编程小案例—利用flask查询本机IP归属并输出网页图片

Python编程小案例—利用flask查询本机IP归属并输出网页图片 环境&#xff1a;Pycharm Mac OS 源码如下&#xff1a; from flask import Flask, render_template, requestapp Flask(__name__)app.route(/) def index():return render_template(IP查询.html)if __name__ __…