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

news2024/11/15 12:46:12
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.coloradmin.cn/o/1484287.html

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

相关文章

【机器学习】包裹式特征选择之递归特征消除法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

Spring Cloud Gateway-系统保护Sentinel集成

文章目录 Sentinel介绍Spring Cloud Gateway集成Sentinelpom依赖Sentinel配置Sentinel集成Nacos作为数据源自定义降级响应 Sentinel介绍 ​ 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&a…

官宣 | 凯琦供应链成为亚马逊SPN物流服务商!

再播一条喜讯&#xff01;在亚马逊官方平台的筛选考核下&#xff0c;凯琦供应链近日正式入驻亚马逊SPN服务商平台&#xff0c;成为亚马逊SPN第三方承运商。 这也标志着凯琦9年来在FBA物流领域的服务质量得到了客户、官方及行业的广泛认可&#xff0c;未来凯琦将继续为亚马逊卖家…

【简略知识】项目开发中,VO,BO,PO,DO,DTO究竟是何方妖怪?

前言 在项目开发中&#xff0c;是否需要定义VO&#xff08;视图对象&#xff09;&#xff0c;BO&#xff08;业务对象&#xff09;&#xff0c;PO&#xff08;持久化对象&#xff09;&#xff0c;DO&#xff08;领域对象&#xff09;&#xff0c;DTO&#xff08;数据传输对象&…

Plyer:一款简单、轻便、可访问和可定制的HTML5、YouTube和Vimeo媒体播放器,支持现代浏览器。

Plyer&#xff1a;一款简单、轻便、可访问和可定制的HTML5、YouTube和Vimeo媒体播放器&#xff0c;支持现代浏览器。 摘要&#xff1a; 随着网络视频内容的爆炸式增长&#xff0c;媒体播放器在网页开发中的作用日益凸显。Plyer作为一款轻便、可访问、可定制的HTML5、YouTube和V…

Qt 简约美观的加载动画 文本风格 第八季

今天和大家分享一个文本风格的加载动画, 有两类,其中一个可以设置文本内容和文本颜色,演示了两份. 共三个动画, 效果如下: 一共三个文件,可以直接编译 , 如果对您有所帮助的话 , 不要忘了点赞呢. //main.cpp #include "LoadingAnimWidget.h" #include <QApplic…

扼杀网络中的环路:STP、RSTP、MSTP

目录 前言&#xff1a; 一、STP&#xff08;Spanning Tree Protocol&#xff09; 1.1 STP功能 1.2 STP应用 二、RSTP&#xff08;Rapid Spanning Tree Protocol&#xff09; 2.1 RSTP功能 2.2 RSTP应用 三、MSTP&#xff08;Multiple Spanning Tree Protocol&#xff0…

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 #源路径 #…

了解Spring中Bean:配置与作用域

作为一名对技术充满热情的学习者&#xff0c;我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代&#xff0c;我远非专家&#xff0c;而是一位不断追求进步的旅行者。通过这篇博客&#xff0c;我想分享我在某个领域的学习经验&#xff0c;与大家共同探讨、共…

几种常见的自动化测试框架

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在软件测试领域&#xff0c;自动化测试框架有很多&#xff0c;这里主要介绍几种常用的自动化测试…

程序员必备开发工具

Chat GPT的升级节奏让人们越来越惊讶的同时,也让大家感觉到了压力,在如此快节奏的互联网世界中,开发人员需要不断学习与更新知识,保持领先地位并高效地交付高质量软件。 无论是集成开发环境 (IDE)、版本控制系统、测试工具、协作平台还是文档工具,学习并掌握这些流行的顶…

嵌入式学习31-指针和函数知识回顾

1.指针&#xff1a; 1.提供一种间接访问数据的方法 2.空间没有名字,只有一个地址编号 2.指针: 1.地址:区分不同内存空间的编号 2.指针:指针就是地址,地址就是指针 3.指针变量:存放指针的变量称为指针变量,简称为指针 3.指针的定义: int *p NULL; …

mysql order by布尔盲注

什么是order by 在MySQL支持使用ORDER BY语句对查询结果集进行排序处理&#xff0c;使用ORDER BY语句不仅支持对单列数据的排序&#xff0c;还支持对数据表中多列数据的排序。语法格式如下 select * from 表名 order by 列名(或者数字) asc&#xff1b;升序(默认升序) selec…

Spark(1)-wordCount入门

1. 创建Maven项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

【DDD】学习笔记-实体和值对象:从领域模型的基础单元看系统设计

今天我们来学习 DDD 战术设计中的两个重要概念&#xff1a;实体和值对象。 这两个概念都是领域模型中的领域对象。它们在领域模型中起什么作用&#xff0c;战术设计时如何将它们映射到代码和数据模型中去&#xff1f;就是我们这一讲重点要关注的问题。 另外&#xff0c;在战略…

每日五道java面试题之mysql数据库篇(二)

目录&#xff1a; 第一题. 什么是索引&#xff1f;第二题. 索引有哪些优缺点&#xff1f;第三题. 创建索引的原则第四题. 创建索引时需要注意什么&#xff1f;第五题. 使用索引查询一定能提高查询的性能吗&#xff1f;为什么&#xff1f; 第一题. 什么是索引&#xff1f; 索引…

【前端素材】推荐优质后台管理系统网页my-Task平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;通常由管理员使用。后台管理系统是一种用于管理和控制网站、应用程序或系统的管理界面。它通常被设计用来让网站或应用程序的管理员或运营人员管理内容、用户、数据以及其他相关功…

查找算法——java

顺序查找&#xff08;顺序表查找&#xff09; 顺序查找也称为线形查找&#xff0c;属于无序查找算法。从数据结构线形表的一端开始&#xff0c;顺序扫描&#xff0c;依次将扫描到的结 点关键字与给定值k相比较&#xff0c;若相等则表示查找成功&#xff1b;若扫描结束仍没…

web服务器nginx下载及在win11的安装

一.背景 还是为了公司安排的师带徒任务。 操作系统版本&#xff1a;win11 家庭版 mginx版本&#xff1a;1.24.0 二.nginx版本选择与下载 我之前也写过下载nginx下载_ngnix stable 下载-CSDN博客 不想看寻找过程的&#xff0c;直接点这里去下载https://nginx.org/download…

抖音视频评论抓取软件|视频批量下载

抖音视频评论采集软件是一款基于C#开发的高效、便捷的工具&#xff0c;旨在为用户提供全面的数据采集和分析服务。该软件不仅支持通过关键词进行搜索抓取&#xff0c;还能够通过分享链接进行单个视频的抓取和下载&#xff0c;让用户轻松获取抖音视频评论数据。 &#x1f50d; …