学习笔记整理-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冒泡
    • 使用事件委托时要注意:不能委托不冒泡的事件给祖先元素
    • 最内层元素不能再有额外的内层元素了。

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

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

相关文章

开学季电容笔怎么选?iPad第三方电容笔了解下

不少的学生党开学必备清单里都少不了电容笔&#xff0c;可见其的重要性。自从苹果发布了ipad的原装电容笔以来&#xff0c;这款电容笔在目前市面上就一直很受欢迎&#xff0c;不过由于Apple Pencil的售价实在是太贵了&#xff0c;使得大部分人都买不起。于是&#xff0c;市面上…

在 Linux 虚拟机上使用 Azure 自定义脚本扩展版本

参考 azure创建虚拟机,创建虚拟机注意入站端口规则开放80端口、 2.转到资源&#xff0c;点击扩展应用程序&#xff0c;创建存储账户&#xff0c;创建容器&#xff0c;上传文件&#xff0c;选择文件&#xff0c;会自动执行部署。 apt-get update -y && apt-get insta…

chatgpt和xmind结合起来帮你制作精美的思维导图

介绍 chatgpt和xmind结合起来帮你制作精美的思维导图。 1.输出Markdown格式 2.xmind导入.md文件

div输入框的文字超过指定行数用省略号表示css

实现效果&#xff1a;超过四行用省略号表示 实现方法&#xff1a; .text{overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 4; // 自定义行数-webkit-box-orient: vertical; }

【设计模式】代理模式

在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口。 介绍 意图&#xff1a;为其他对象提供一种代理以…

TX Text Control .NET Server for ASP.NET Crack

TX Text Control .NET Server for ASP.NET Crack TX Text Control.NET Server for ASP.NET是用于Web应用程序或服务的服务器端组件。它是一个完全可编程的ASP.NET文字处理引擎&#xff0c;提供了广泛的文字处理功能。使用TX Text Control.NET Server&#xff0c;程序员可以开发…

【833. 字符串中的查找与替换】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 你会得到一个字符串 s (索引从 0 开始)&#xff0c;你必须对它执行 k 个替换操作。替换操作以三个长度均为 k 的并行数组给出&#xff1a;indices, sources, targets。 要完成第 i 个替换操作: 检查…

Spring事务传播机制

hi ,大家好,继续为大家带来Spring事务传播机制的相关知识 文章目录 &#x1f917;1.事务传播机制是什么&#x1f917;2.事务传播机制作用&#x1f917;3.事务传播机制 &#x1f917;1.事务传播机制是什么 定义了多个包含了事务的⽅法&#xff0c;相互调⽤时&#xff0c;事务是…

[C++ 网络协议编程] UDP协议

目录 1. UDP和TCP的区别 2. UDP的工作原理 3. UDP存在数据边界 4. UDP的I/O函数 4.1 sendto函数 4.2 recvfrom函数 4. 已连接(connected)UDP套接字和未连接(unconnected)UDP套接字 5. UDP的通信流程 5.1 服务器端通信流程 5.2 客户端通信流程 1. UDP和TCP的区别 主要…

【深度学习】日常笔记16

可以将pd.DataFrame数据结构理解为类似于Excel中的表格。pd.DataFrame是pandas库提供的一个二维数据结构&#xff0c;用于存储和操作具有行和列的数据。它类似于Excel中的工作表&#xff0c;其中每一列可以是不同的数据类型&#xff08;例如整数、浮点数、字符串等&#xff09;…

关于安卓打包生成aar,jar实现(一)

关于安卓打包生成aar&#xff0c;jar方式 背景 在开发的过程中&#xff0c;主项目引入三方功能的方式有很多&#xff0c;主要是以下几个方面&#xff1a; &#xff08;1&#xff09;直接引入源代码module&#xff08;优点&#xff1a;方便修改源码&#xff0c;易于维护&#…

Spring_AOP

一、AOP简介 AOP&#xff0c;Aspect Oriented Programming,面向切面编程,是对面向对象编程0OP的升华。OOP是纵向对一个事物的抽象&#xff0c;一个对象包括静态的属性信息&#xff0c;包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属性与属性、方法与方法、对象与对象…

Vue 安装开发者工具

1.下载开发者工具&#xff0c;下载地址&#xff1a;http://book.wiyp.top/App/Vue3开发者工具-谷歌/Vue3.crx 2.打开谷歌浏览器&#xff0c;点击扩展&#xff0c;点击管理扩展程序。 3.开启开发者模式&#xff0c;将 Vue3 开发者工具文件拖拽到浏览器中进行安装。 注&#xff…

chatGPT小白快速入门培训课程-001

一、前言 本文是《chatGPT小白快速入门培训课程》的第001篇文章&#xff0c;全部内容采用chatGPT和chatGPT开源平替软件生成。完整内容大纲详见&#xff1a;《chatGPT小白快速入门课程大纲》。 本系列文章&#xff0c;参与&#xff1a; AIGC征文活动 #AIGC技术创作内容征文# …

使用pymupdf实现PDF内容搜索并显示功能

简介&#xff1a; 在日常工作和学习中&#xff0c;我们可能需要查找和提取PDF文件中的特定内容。本文将介绍如何使用Python编程语言和wxPython图形用户界面库来实现一个简单的PDF内容搜索工具。我们将使用PyMuPDF模块来处理PDF文件&#xff0c;并结合wxPython构建一个用户友好的…

虹科方案 | 汽车总线协议转换解决方案(二)

上期说到&#xff0c;虹科的PCAN-LIN网关在CAN、LIN总线转换方面有显著的作用&#xff0c;尤其是为BMS电池通信的测试提供了优秀的解决方案。假如您感兴趣&#xff0c;可以点击文末相关链接进行回顾&#xff01; 而今天&#xff0c;虹科将继续给大家带来Router系列在各个领域的…

elasticsearch 基础

ES 搜索技术历史 今天看的是《Elasticsearch实战与原理解析》 第一章 搜索技术发展史 1、搜索技术发展史 宏观而言&#xff0c;搜索引擎的发展经历了五个尖端和两大分类。五个阶段分别是ftp文件检索阶段、分类目录阶段、文本相关性检索阶段、网页链接分析阶段和用户意图识别…

【Pytorch:nn.Embedding】简介以及使用方法:用于生成固定数量的具有指定维度的嵌入向量embedding vector

文章目录 1、nn.Embedding2、使用场景 1、nn.Embedding 首先我们讲解一下关于嵌入向量embedding vector的概念 1&#xff09;在自然语言处理NLP领域&#xff0c;是将单词、短语或其他文本单位映射到一个固定长度的实数向量空间中。嵌入向量具有较低的维度&#xff0c;通常在几…

[Mongodb 5.0]单机启动

安装完mongodb后&#xff0c;会自动生成下面两个目录(mongod.conf中设定的)&#xff0c;用来存放日志和数据 /var/lib/mongo (数据目录) /var/log/mongodb (日志目录) 要启动一个单机版的mongodb&#xff0c;一般有两种方式&#xff1a; 第一种启动方式&#xff1a;直接使用…

第5章:神经网络

神经元模型 上述定义的简单单元即为神经元模型。 多层网络 误差逆传播算法 标准BP算法&#xff1a;参数更新非常频繁&#xff0c;可能出现抵消现象。积累BP算法&#xff1a;下降到一定程度上&#xff0c;进行下一步会非常缓慢。 过拟合 早停&#xff1a;划分训练集和验证集…