JavaScript-事件监听、事件对象与事件流

news2025/1/16 0:45:27

事件监听

  • 什么是事件
  • 什么是事件监听?
    • 事件监听三要素
  • 事件监听
    • L0 绑定
    • L2 绑定
    • 区别
    • vue绑定
  • 事件类型
    • 鼠标事件
    • 键盘事件
    • 焦点事件
    • 文本事件
  • 什么是事件对象
  • 获取事件对象
  • 环境对象
  • 回调函数
  • 事件流
  • 事件捕获
  • 事件冒泡
    • 阻止冒泡
  • 解绑事件
  • 两种注册事件的区别
  • 事件委托

什么是事件

  • 事件是在编程时系统内发生的动作或者发生的事情
  • 比如用户在网页上单击一个按钮

什么是事件监听?

  • 就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应,也称为 绑定事件或者注册事
  • 比如鼠标经过显示下拉菜单,比如点击可以播放轮播图等等

事件监听三要素

  • 事件源: 那个dom元素被事件触发了,要获取dom元素
  • 事件类型: 用什么方式触发,比如鼠标单击 click、鼠标经过 mouseover 等
  • 事件调用的函数: 要做什么事

事件监听

L0 绑定

语法:元素对象.on事件 = function() { }

  <button>点击</button>
 	const btn = document.querySelector('button')
	btn.onclick = function(){
		alert('点击')
	}

L2 绑定

语法:元素对象.addEventListener(‘事件类型’,要执行的函数)

  <button>点击</button>
    // 需求: 点击了按钮,弹出一个对话框
    // 1. 事件源   按钮  
    // 2.事件类型 点击鼠标   click 字符串
    // 3. 事件处理程序 弹出对话框
    const btn = document.querySelector('button')
    btn.addEventListener('click', function () {
      alert('你早呀~')
    })

区别

on方式会被覆盖,addEventListener方式可绑定多次,拥有事件更多特性,推荐使用

vue绑定

  <button onclick="hi()">点击</button>
    function hi(){
      alert('你好呀~')
    }

事件类型

鼠标事件

鼠标出发

类型触发
click鼠标点击
mouseenter鼠标经过
mouseleave鼠标离开
dblclick鼠标双击

键盘事件

键盘触发

类型触发
keydown键盘按下触发
keyup键盘抬起触发

焦点事件

表单获得光标

类型触发
focus获得焦点
blur失去焦点

文本事件

表单输入触发

类型触发
input用户输入事件

什么是事件对象

  • 也是个对象,这个对象里有事件触发时的相关信息
  • 例如:鼠标点击事件中,事件对象就存了鼠标点在哪个位置等信息
  • 使用场景
    • 可以判断用户按下哪个键,比如按下回车键可以发布新闻
    • 可以判断鼠标点击了哪个元素,从而做相应的操作

获取事件对象

在事件绑定的回调函数的第一个参数就是事件对象
一般命名为event、ev、e
语法:元素.addEventListener(‘事件类型’,function(e){})

	input type="text">
    const input = document.querySelector('input')
    input.addEventListener('keyup', function (e) {
      // console.log(e.key)
      if (e.key === 'Enter') {
        console.log('我按下了回车键')
      }
    })

环境对象

指的是函数内部特殊的变量 this ,它代表着当前函数运行时所处的环境
作用:弄清楚this的指向,可以让我们代码更简洁

  • 函数的调用方式不同,this 指代的对象也不同
  • 【谁调用, this 就是谁】 是判断 this 指向的粗略规则
  • 直接调用函数,其实相当于是 window.函数,所以 this 指代 window
 <button>点击</button>
    // 每个函数里面都有this 环境对象  普通函数里面this指向的是window
    // function fn() {
    // 指向windo
    //   console.log(this)
    // }
    // window.fn()
    const btn = document.querySelector('button')
    btn.addEventListener('click', function () {
      // console.log(this)  // btn 对象
      // btn.style.color = 'red'
      this.style.color = 'red'
    })

回调函数

如果将函数 A 做为参数传递给函数 B 时,我们称函数 A 为回调函数
简单理解: 当一个函数当做参数来传递给另外一个函数的时候,这个函数就是回调函数

	//function函数就是回调函数
    btn.addEventListener('click', function () {
      alert(11)
    })

事件流

事件流指的是事件完整执行过程中的流动路径
在这里插入图片描述

  • 说明:假设页面里有个div,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段
  • 简单来说:捕获阶段是 从父到子 冒泡阶段是从子到父
  • 实际工作都是使用事件冒泡为主

事件捕获

从DOM的根元素开始去执行对应的事件 (从外到里)
事件捕获需要写对应代码才能看到效果
语法:DOM.AddEventListener(‘事件类型’,事件处理函数,是否使用捕获机制)
说明:

  • addEventListener第三个参数传入 true 代表是捕获阶段触发(很少使用)
  • 若传入false代表冒泡阶段触发,默认就是false
  • 若是用L0 事件监听,则只有冒泡阶段,没有捕获
  <div class="father">
    <div class="son"></div>
  </div>
    const fa = document.querySelector('.father')
    const son = document.querySelector('.son')
    // 输出:爷爷-爸爸-儿子,从大目标到小目标全部查找  
    document.addEventListener('click', function () {
      alert('爷爷')
    }, true)
    fa.addEventListener('click', function () {
      alert('爸爸')
    }, true)
    son.addEventListener('click', function () {
      alert('儿子')
    }, true)

事件冒泡

当一个元素的事件被触发时,同样的事件将会在该元素的所有祖先元素中依次被触发。这一过程被称为事件冒

  • 简单理解:当一个元素触发事件后,会依次向上调用所有父级元素的 同名事件
  • 事件冒泡是默认存在的
  • L2事件监听第三个参数是 false,或者默认都是冒泡

阻止冒泡

问题:因为默认就有冒泡模式的存在,所以容易导致事件影响到父级元素
需求:若想把事件就限制在当前元素内,就需要阻止事件冒泡
前提:阻止事件冒泡需要拿到事件对象
语法:事件对象.stopPropagation()
注意:此方法可以阻断事件流动传播,不光在冒泡阶段有效,捕获阶段也有效

  <div class="father">
    <div class="son"></div>
  </div>
    const fa = document.querySelector('.father')
    const son = document.querySelector('.son')
    //  输出:儿子-爸爸-爷爷,从小目标到大目标
    document.addEventListener('click', function () {
      alert('爷爷')
    })
    fa.addEventListener('click', function () {
      alert('爸爸')
    })
    son.addEventListener('click', function (e) {
      alert('儿子')
      // 阻止冒泡  事件对象.stopPropagation()
      // 点击儿子时,只输出儿子,不会向上输出
      //e.stopPropagation()
    })

解绑事件

  • on事件方式
    直接使用null覆盖偶就可以实现事件的解绑
    语法:对象.onclick = null
	// L0 绑定事件
	btn.onclick = function(){
		alert('点击')
	}
	
	//解绑事件
	btn.onclick = null
  • addEventListener方式
    语法:removeEventListener(事件类型, 事件处理函数, [获取捕获或者冒泡阶段])
    注意:匿名函数无法被解绑
    function fn() {
      alert('点击')
    }
    // L2 事件绑定
    btn.addEventListener('click', fn)
    // L2 事件移除解绑
    btn.removeEventListener('click', fn)

两种注册事件的区别

  • 传统on注册(L0)
    • 同一个对象,后面注册的事件会覆盖前面注册(同一个事件)
    • 直接使用null覆盖偶就可以实现事件的解绑
    • 都是冒泡阶段执行的
  • 事件监听注册(L2)
    • 语法: addEventListener(事件类型, 事件处理函数, 是否使用捕获)
    • 后面注册的事件不会覆盖前面注册的事件(同一个事件)
    • 可以通过第三个参数去确定是在冒泡或者捕获阶段执行
    • 必须使用removeEventListener(事件类型, 事件处理函数, 获取捕获或者冒泡阶段)
    • 匿名函数无法被解绑

事件委托

事件委托是利用事件流的特征解决一些开发需求的知识技巧
优点:减少注册次数,可以提高程序性能
原理:事件委托其实是利用事件冒泡的特点,给父元素注册事件,当我们触发子元素的时候,会冒泡到父元素身上,从而触发父元素的事件
ul父元素 li 子元素 点击事件
ul.addEventListener(‘click’, function(){}) 点击li子元素执行ul父级点击事件
语法:事件对象.target.tagName 可以获得真正触发事件的元素

  <ul>
    <li>第1个孩子</li>
    <li>第2个孩子</li>
    <li>第3个孩子</li>
    <li>第4个孩子</li>
    <li>第5个孩子</li>
    <p>我不需要变色</p>
  </ul>
    // 需求:点击每个小li 当前li 文字变为红色
    // 按照事件委托的方式  委托给父级,事件写到父级身上
    // 获得父元素
    const ul = document.querySelector('ul')
    ul.addEventListener('click', function (e) {
      // console.dir(e.target) // 就是我们点击的那个对象
      // e.target.style.color = 'red'
      // 我们只要点击li才会有效果,e.target.tagName获取当前触发元素名
      if (e.target.tagName === 'LI') {
        e.target.style.color = 'red'
      }
    })

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

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

相关文章

「笔试刷题」:孩子们的游戏(圆圈中最后剩下的数)

一、题目 描述 每年六一儿童节&#xff0c;牛客都会准备一些小礼物和小游戏去看望孤儿院的孩子们。其中&#xff0c;有个游戏是这样的&#xff1a;首先&#xff0c;让 n 个小朋友们围成一个大圈&#xff0c;小朋友们的编号是0~n-1。然后&#xff0c;随机指定一个数 m &#xf…

敏捷之Scrum开发

目录 一、什么是 Scrum 1.1 Scrum 的定义 二、Scrum 迭代开发过程 2.1 迭代开发过程说明 2.1.1 开发方法 2.1.1.1 增量模型 2.1.1.1.1 定义 2.1.1.1.2 模型方法说明 2.1.1.2 迭代模型 2.1.1.2.1 定义 2.1.1.2.2 模型方法说明 2.1.2 迭代过程 2.1.2.1 产品需求Produ…

GPU服务器和普通服务器有何区别?

众所周知&#xff0c;服务器是网络中的重要设备&#xff0c;要接受少至几十人、多至成千上万人的访问&#xff0c;因此对服务器具有大数据量的快速吞吐、超强的稳定性、长时间运行等严格要求。 GPU服务器和普通服务器的主要区别在于硬件配置和适用场景&#xff0c;特别是处理器…

STM32修改主频的方法

大家都知道STM32F103C8T6的主频是72M&#xff0c;那怎么样才能在程序中获得这个主频的值呢&#xff1f;怎么样才能更改主频的值呢&#xff1f; 如图找到主频的变量&#xff0c;然后显示这个变量就是显示主频了。 #include "stm32f10x.h" // Device…

【图解计算机网络】简单易懂的https原理解析

简单易懂的https原理解析 https与http的区别混合加密对称加密非对称加密混合加密解析混合加密问题 摘要算法数字证书数字证书原理为什么通过CA证书可以解决中间人攻击的问题呢&#xff1f; https握手流程 https与http的区别 http是明文传输的&#xff0c;非常不安全&#xff0…

Java混淆的重要性

在软件开发领域&#xff0c;安全性与代码保护一直是备受关注的问题。特别是在Java这样的跨平台语言中&#xff0c;保护源代码的机密性和完整性显得尤为重要。Java混淆作为一种代码保护技术&#xff0c;其在现代软件开发中的地位日益凸显。本文将详细探讨Java混淆的重要性&#…

Java上传文件并存储到MySQL数据库

Java上传文件并存储到MySQL数据库实现过程&#xff1a; 第一步创建接口层 /** *文件接口层 */RestControllerRequestMapping("/file")public class FileController { //引用文件业务层 Resource private FileService fileService; /** *上传文件接…

基于51单片机的智能红外遥控电源电压调节系统设计

基于51单片机的智能红外遥控电源电压调节系统设计 摘要&#xff1a;随着科技的发展&#xff0c;电源电压调节系统在各种电子设备中发挥着越来越重要的作用。本文设计了一种基于51单片机的智能红外遥控电源电压调节系统&#xff0c;该系统能够通过红外遥控器实现对电源电压的快…

网络安全实训Day23

网络空间安全实训-渗透测试 文件上传攻击 定义 将Webshell文件上传到网站服务器上&#xff0c;从而获得网站整台服务器控制权限的攻击方式 Webshell 一种以网页形式存在的命令行执行环境&#xff0c;又称网页木马 分类 一句话木马 只有一行代码&#xff0c;功能强大&#xff…

ssm智能停车场管理系统

视频演示效果: SSMvue智能停车场 摘 要 本论文主要论述了如何使用JAVA语言开发一个智能停车场管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述智能停车…

【匹配】匈牙利匹配算法

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 匈牙利匹配算法 1. 正文 1.1 基础概念 二分图 顶点分为两个集合&#xff0c;集合间顶点相连&#xff0c;集合内点不相连 匹配 一个匹配就是一个边的…

ZYNQ之嵌入式开发04——自定义IP核实现呼吸灯、固化程序

文章目录 自定义IP核——呼吸灯实验固化程序 自定义IP核——呼吸灯实验 Xilinx官方提供了很多IP核&#xff0c;在Vivado的IP Catalog中可以查看这些IP核&#xff0c;在构建自己复杂的系统时&#xff0c;只使用Xilinx官方的免费IP核一般满足不了设计的要求&#xff0c;因此很多…

【Linux进程】守护进程

【Linux进程】守护进程 目录 【Linux进程】守护进程守护进程守护进程概念进程组和会话的概念 系统的守护进程函数 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2024.4.27 前言&#xff1a;本篇博客将会介绍守护进程&#xff0c;以及进程组和会话的概念&#xff0c;如何变成…

我教你如何可翻页电子画册

​电子画册是一种创新的方式&#xff0c;可以将传统的纸质画册转化为数字化的形式&#xff0c;并且具备翻页的功能。它不仅可以提供更好的阅读体验&#xff0c;还可以方便地分享给他人。 1.选择制作工具&#xff1a; 有许多在线平台和软件可以帮助你制作电子画册&#xff0c;比…

Qt6找不到Bluetooth蓝牙组件

图文解释来了&#xff01;调试了一下午。 错误如图&#xff1a; Failed to find required Qt component "Bluetooth" 解决方法&#xff1a; 找到安装QT安装包下的MaintenanceTool.exe&#xff0c;双击打开 打开后&#xff0c;找到这个Qt Connectivity&#xff0c;…

ChatGPT有记忆了?!持久记忆(Memory)功能详细解读和教程!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

【个人博客搭建】(11)swagger添加jwt信息

这个主要是为了方便使用swagger时&#xff0c;能更好的带入我们的token。 ps&#xff1a;如果使用其他第三方api工具&#xff08;apipost、postman等&#xff09;则不需要。 &#xff08;当然&#xff0c;不用不能没有&#xff0c;是吧&#xff09; 1、在AddSwaggerGen内添加…

阿里开源截止目前为止参数规模最大的Qwen1.5-110B模型:MMLU评测接近Llama-3-70B,略超Mixtral-8×22B!

本文原文来自DataLearnerAI官方网站&#xff1a;阿里开源截止目前为止参数规模最大的Qwen1.5-110B模型&#xff1a;MMLU评测接近Llama-3-70B&#xff0c;略超Mixtral-822B&#xff01; | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051714140775766 Qw…

Android使用AlertDialog实现弹出菜单

最近又开始捣鼓APP&#xff0c;许多api , class都忘记怎么用了&#xff0c;楼下使用AlertDialog实现个弹出菜单&#xff0c;结果直接crash&#xff0c;查了半天&#xff0c;终于即将&#xff0c;记录一下…… 1 实现代码 AlertDialog.Builder mBuilder new AlertDialog.Builde…

纯血鸿蒙APP实战开发——主页瀑布流实现

介绍 本示例介绍使用ArkUIWaterFlow组件和LazyForEach实现瀑布流场景。该场景多用于购物、资讯类应用。 效果图预览 使用说明 加载完成后显示整个列表&#xff0c;超过一屏时可以上下滑动。 实现思路 创建WaterFlowDataSource类&#xff0c;实现IDataSource接口的对象&…