学习笔记整理-DOM-02-事件监听

一、什么是"事件监听"

  • DOM允许书写JavaScript代码以让HTML元素对事件作出反应
  • 什么是"事件": 用户与网页的交互动作
  • 当用户点击元素时
  • 当鼠标移动到元素上时
  • 当文本框的内容被改变时
  • 当键盘在文本框中被按下时
  • 当网页已加载完毕时
  • “监听”,顾名思义,就是让计算机随时能够发现这个事件发生了,从而执行程序员预先编写的一些程序。

  • 设置事件监听的方法主要有onxxxaddEventListener()两种,

  • 常见的鼠标事件监听

    事件名事件描述
    onclick当鼠标单击某个对象
    ondblclick当鼠标双击某个对象
    onmousedown当某个鼠标按键在某个对象上被按下
    onmouseup当某个鼠标按键在某个对象上被松开
    onmousemove当某个鼠标按键在某个对象上被移动
    onmouseenter当鼠标进入某个对象(相似事件onmouseover)
    onmouseleave当鼠标离开某个对象(相似事件onmouseout)
  • 常见的键盘事件监听

    事件名事件描述
    onkeypress当某个键盘的键被按下(系统按钮如箭头键和 功能键无法得到识别)
    onkeydown当某个键盘的键被按下(系统按钮可以识别, 并且会先于onkeypress发生)
    onkeyup当某个键盘的键被松开
  • 常见的表单事件监听

    事件名事件描述
    onchange当用户改变域的内容
    onfocus当某元素获得焦点(比如tab键或鼠标点击)
    onblur当某元素失去焦点
    onsubmit当表单被提交
    onreset当表单被重置
    oninput当表单输入
  • 常见的页面事件监听

    事件名事件描述
    onload当页面或图像被完成加载
    onunload当用户退出页面

二、事件传播

  • 事件的传播是:先从外到内,然后再从内到外
    spread

  • onxxx写法和addEventListener()方法区别

    • onxxx写法只能监听冒泡阶段,DOM0级事件监听。
    • addEventListener(),通过参数控制,可以监听捕获或者冒泡,DOM2级事件监听。
  • 注意:

    • 最内部元素不再区分捕获和冒泡阶段,会先执行写在前面的监听,然后执行后写的监听。
    • 如果给元素设置相同的两个或多个同名事件,则DOM0级写法后面写的会覆盖先写的;而DOM2级会按顺序执行。

三、事件对象

  • 事件处理函数提供一个形式参数,它是一个对象,封装了本次事件的细节

  • 这个参数通常用单词event或字母e来表示。

      oBox.onmousemove = function (e) {
        // 对象e就是这次事件的"事件对象"
      }
    
  • 鼠标位置

    属性属性描述
    clientX鼠标指针相对于浏览器的水平坐标
    clientY鼠标指针相对于浏览器的垂直坐标
    pageX鼠标指针相对于整体网页的水平坐标
    pageY鼠标指针相对于整体网页的垂直坐标
    offsetX鼠标指针相对于事件源元素的水平坐标
    offsetY鼠标指针相对于事件源元素的垂直坐标

    offset
    client
    page

  • e.charCodee.keyCode属性

    • e.charCode属性通常用于onkeypress事件中,表示用户输入的字符的"字符码"。
    • e.keyCode属性通常用于onkeydowm事件中和onkeyup中,表示用户按下的按键的"键码"。
  • charCode字符码

    字符字符码
    数字0~数字948~57
    大写字母A~Z65~90
    小写字母a~z97~122
  • keyCode键码

    按键键码
    数字0~数字948~57
    字母不分大小a~z65~90
    四个方向键左、上、右、下37、38、39、40
    回车键13
    空格键32
  • e.preventDefault()方法

    • e.preventDefault()方法用来阻止事件产生的"默认动作"
  • e.stopPropagation()方法
    -e.stopPropagation()方法用来阻止事件继续传播

    • 一些场合,非常有必要切断事件继续传播,否则会造成页面特效显示bug。

四、事件委托

批量添加事件监听

题目:页面上一个无序列表<ul>,它内部共有20个<li>元素,请批量给它们添加点击事件监听,实现效果:点击哪个
<li>元素,哪个<li>元素就变红。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <ul id="list">
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
        <li>列表项</li>
    </ul>

    <script>
        var oList = document.getElementById('list');
        var lis = oList.getElementsByTagName('li');

        // 书写循环语句,批量给元素添加监听
        for (var i = 0; i < lis.length; i++) {
            lis[i].onclick = function () {
                // 在这个函数中,this表示点击的这个元素,this涉及函数上下文的相关知识,我们在“面向对象”课程中介绍
                this.style.color = 'red';
            };
        }
    </script>
</body>

</html>
  • 批量添加事件监听的性能问题

    • 每一个事件监听注册都会消耗一定的系统内存,而批量添 加事件会导致监听数量太多,内存消耗会非常大
    • 实际上,每个<li>的事件处理函数都是不同的函数,这些函数本身也会占用内存。
  • 新增元素动态绑定事件

    题目:页面上有一个无序列表<ul>,它内部没有<li>元素, 请制作一个按钮,点击这个按钮就能增加一个<li>元素。
    并且要求每个增加的<li>元素也要有点击事件监听,实现效果 点击哪个<li>元素,哪个<li>元素就变红

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    
    <body>
        <button id="btn">按我添加新的li列表项</button>
        <ul id="list"></ul>
    
        <script>
            var oBtn = document.getElementById('btn');
            var oList = document.getElementById('list');
            var lis = oList.getElementsByTagName('li');
    
            // 按钮的点击事件
            oBtn.onclick = function () {
                // 创建一个新的li列表项,孤儿节点
                var oLi = document.createElement('li');
                oLi.innerHTML = '我是列表项';
                // 上树
                oList.appendChild(oLi);
                // 给新创建的这个li节点添加onclick事件监听
                oLi.onclick = function () {
                    this.style.color = 'red';
                };
            };
        </script>
    </body>
    
    </html>
    
    • 动态绑定事件的问题
      • 新增元素必须分别添加事件监听,不能自动获取事件监听
      • 大量事件监听、大量事件处理函数会产生大量内存消耗
  • 事件委托

    • 利用事件冒泡机制,将后代元素事件委托给祖先元素

    • 事件委托通常需要结合使用e.target属性

      参数描述
      target触发此事件的最早元素,即"事件源元素"
      currentTarget事件处理程序附加到的元素
      <!DOCTYPE html>
      <html lang="en">
      
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Document</title>
      </head>
      
      <body>
          <button id="btn">按我创建一个新列表项</button>
          <ul id="list">
              <li>列表项</li>
              <li>列表项</li>
              <li>列表项</li>
          </ul>
          <script>
              var oList = document.getElementById('list');
              var oBtn = document.getElementById('btn');
      
              oList.onclick = function (e) {
                  // e.target表示用户真正点击的那个元素
                  e.target.style.color = 'red';
              };
      
              oBtn.onclick = function () {
                  // 创建新的li元素
                  var oLi = document.createElement('li');
                  // 写内容
                  oLi.innerText = '我是新来的';
                  // 上树
                  oList.appendChild(oLi);
              };
          </script>
      </body>
      
      </html>
      
  • 事件委托的使用场景

    • 当有大量类似元素需要批量添加事件监听时,使用事件委 托可以减少内存开销。
    • 当有动态元素节点上树时,使用事件委托可以让新上树的 元素具有事件监听
  • 使用事件委托时需要注意的事项

    • onmouseenter和onmouseover都表示"鼠标进入",它们有什么区别呢?
      • onmouseenter不冒泡onmouseover冒泡
    • 使用事件委托时要注意:不能委托不冒泡的事件给祖先元素
    • 最内层元素不能再有额外的内层元素了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6.利用matlab完成 符号矩阵的秩和 符号方阵的逆矩阵和行列式 (matlab程序)

1.简述 利用M文件建立矩阵 对于比较大且比较复杂的矩阵&#xff0c;可以为它专门建立一个M文件。下面通过一个简单例子来说明如何利用M文件创建矩阵。 例2-2 利用M文件建立MYMAT矩阵。(1) 启动有关编辑程序或MATLAB文本编辑器&#xff0c;并输入待建矩阵&#xff1a;(2) 把…

Centos 防火墙命令

查看防火墙状态 systemctl status firewalld.service 或者 firewall-cmd --state 开启防火墙 单次开启防火墙 systemctl start firewalld.service 开机自启动防火墙 systemctl enable firewalld.service 重启防火墙 systemctl restart firewalld.service 防火墙设置开…

【mysql】事务的四种特性的理解

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

Vite更新依赖缓存失败,强制更新依赖缓存

使用vitets开发一段时间了&#xff0c;感觉并不是想象中的好用&#xff0c;特别是出现些稀奇古怪的问题不好解决&#xff0c;比如下面这个问题 上午9:50:08 [vite] error while updating dependencies: Error: ENOENT: no such file or directory, open E:/workspace-dir/node…

Leetcode33 搜索旋转排序数组

题解&#xff1a; /*** 旋转排序数组可分为N1 N2两个部分&#xff0c;如&#xff1a;[4,5,6,7,1,2,3]&#xff0c;N1为[4,5,6,7]&#xff0c;N2为[1,2,3]** 必然满足以下两个条件&#xff1a;* 1. N1和N2都是分别递增的&#xff1b;* 2. N1中的所有元素大于N2中的所有元素;** …

研发协同工具哪个好用?比较常用的研发协同工具及其特点

Zoho Projects是一款在线的SaaS研发协同工具&#xff0c;支持敏捷开发/DevOps/Scrum等项目协作&#xff0c;最大的特点就是“会说话”&#xff0c;意思是&#xff1a;它可以把在项目协作过程中重要和相关的消息和信息通过恰到好处的方式告诉你&#xff0c;解决&#xff1a;开发…

Mac OS minicom 无法设置921600问题

MacOS minicom 无法设置921600问题 介绍过程解决方案参考资料 介绍 minicom是Mac上一款非常好用的串口工具。本文假设你已经安装minicom&#xff0c;并且知道minicom的一般配置和使用方法。这是“MacOS minicom 无法设置921600”的解决问题记录。它在以下环境中设置成功&#…

HarmonyOS NEXT新能力,一站式高效开发HarmonyOS应用

2023年8月6日华为开发者大会2023&#xff08;HDC.Together&#xff09;圆满收官&#xff0c;伴随着HarmonyOS 4的发布&#xff0c;华为向开发者发布了汇聚所有最新开发能力的HarmonyOS NEXT开发者预览版&#xff0c;并分享了围绕“一次开发&#xff0c;多端部署” “可分可合&a…

安防监控视频云存储平台EasyCVRH.265转码功能更新:新增分辨率配置

安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储…

docker compose部署zookeeper

单机部署 新建docker-compose.yaml version: 3 services:zookeeper:image: zookeeper:3.5.7container_name: base-zookeeperhostname: zookeeperprivileged: truerestart: alwaysports:- 2181:2181environment:TZ: "Asia/Shanghai"volumes:- ./volumes/zookeeper/d…

Python 处理 Excel 表格的 14 个常用操作

目录 1. 安装依赖库 2. 导入库 3. 读取Excel文件 4. 写入Excel文件 5. 创建工作表 6. 访问工作表 7. 读取单元格数据 8. 写入单元格数据 9. 获取行数和列数 10. 过滤数据 11. 排序数据 12. 添加新行 13. 删除行或列 14. 计算汇总统计 总结 无论是数据分析师、财…

实习笔记(一)

自定义注解&#xff1a; 自定义注解中有三个元注解Target,Retention,Document /*** 系统日志注解** author Mark sunlightcsgmail.com*/ Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface SysLog {String value() default "…

『C语言初阶』第八章 -隐式类型转换规则

前言 今天小羊又来给铁汁们分享关于C语言的隐式类型转换规则&#xff0c;在C语言中类型转换方式可分为隐式类型转换和显式类型转换(强制类型转换)&#xff0c;其中隐式类型转换是由编译器自动进行&#xff0c;无需程序员干预&#xff0c;今天小羊课堂说的就是关于隐式类型转换…

Splashtop 获得 ISO 27001 认证

2023年8月15日 加利福尼亚州库比蒂诺 Splashtop 在随处办公远程解决方案领域处于领先地位&#xff0c;该公司今天宣布已获得 ISO/IEC 27001 认证&#xff0c;印证了其对坚持最高标准的信息安全管理系统&#xff08;ISMS&#xff09;、为客户提供数据保护以及遵守法律法规要求的…

ChatGPT​保密吗?它有哪些潜在风险?如何规避?

自2022年11月公开发布以来&#xff0c;ChatGPT已成为许多企业和个人的必备工具&#xff0c;但随着该技术越来越多地融入我们的日常生活&#xff0c;人们很自然地想知道&#xff1a;ChatGPT是否是保密的。 问&#xff1a;ChatGPT保密吗&#xff1f; 答&#xff1a;否&#xff0…

矿井下无人值守变电所电力监控系统的探讨与产品选型

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;为了探讨井下无人值守变电所的电力监控系统技术&#xff0c;以西山煤电马兰矿为背景&#xff0c;详细阐述了井下无人值守变电所电力监控系统技术的各项基本参数&#xff0c;如额定工作电压及整机输入视在功…

[Blender]Geometry nodes altermesh to UE

首先要先下载插件 AlterMesh – Use geometry nodes inside Unreal 下载对应版本的插件后 打开UE&#xff0c;在对应的设置里面挂上blender.exe的路径 去官方下载一个Blender Geometry nodes 的示例 Demo Files — blender.org​​​​​​

使用蓝牙外设却不小心把台式机电脑蓝牙关了

起因 今天犯了一个贼SB的错误&#xff0c;起因是蓝牙键盘突然就不能输入了&#xff08;虽然是连接状态&#xff0c;但是按什么键都没有反应&#xff09; 原来我的解决方法就是重启一下电脑&#xff0c;但是那会电脑开了贼多的软件。我就想重启也太麻烦了&#xff0c;既然重启…

Python web实战之Django 的跨站点请求伪造(CSRF)保护详解

关键词&#xff1a;Python、Web、Django、跨站请求伪造、CSRF 大家好&#xff0c;今天我将分享web关于安全的话题&#xff1a;Django 的跨站点请求伪造&#xff08;CSRF&#xff09;保护&#xff0c;介绍 CSRF 的概念、原理和保护方法. 1. CSRF 是什么&#xff1f; CSRF&#…

每天一练:SpringBoot连接mq

目录 每天一练:Springboot连接rabbitmq 每天一练:Springboot连接rabbitmq 目录一、部署Rabbitmq&#xff1f;二、增加maven依赖三、连接RabbitMq四、发布和订阅消息总结 一、部署Rabbitmq&#xff1f; 这里rabbitmq采用docker安装部署。 拉取docker镜像 [root192 ~]# docker…