[JS]DOM事件

事件监听

让程序检测是否有事件产生, 一旦事件触发, 就调用函数做出响应

事件三要素: 事件源(谁的事件) 事件类型(如何触发) 事件处理程序(做什么)

function fn() {}
// 绑定事件
btn.addEventListener('click', fnction() { })

// 绑定事件
btn.addEventListener('click', fn)

// 绑定事件(不推荐)
btn.addEventListener('click', 'fn()')

// 解绑事件
btn.removeEventListener('click',fn)
发展历史
  1. DOM L0
  • DOM发展的第一版
  • 事件绑定: 事件源.on事件 = function() { }
  • 事件解绑: 事件源.on事件 = null
  • 重复注册的事件会被覆盖
  • 仅支持事件冒泡
  1. DOM L1
  • 1998年10月1日成功W3C推荐标准
  1. DOM L2
  • 推荐使用事件柄的方式注册事件
  • 可以重复注册事件, 支持事件冒泡和捕获
  • 匿名函数无法解绑事件
  1. DOM L2
  • 增加了更多的事件类型

事件类型

鼠标事件

点击事件: click

双加击事件: dbclick

移入移出事件: hover //写两个函数,,逗号隔开,用来区分悬停和离开

鼠标经过/离开: mouseenter/mouseleave //不会冒泡(只自己触发)

鼠标经过/离开: mouseover/mouseout //会冒泡

鼠标移动: mousemove

鼠标弹起: mouseup

鼠标按下: mousedown

键盘事件

键盘弹起: keyup (不区分大小写)

键盘按下: keydown (不区分大小写)

键盘按下: keypress (不识别功能键///区分大小写)

表单事件

获取鼠标焦点: focus

失去鼠标焦点: blur

用户数输入: input

内容改变事件: change

事件对象

通过事件对象可以拿到事件触发时的相关信息

// 事件绑定的回调函数的第一个参数就是事件对象
元素.addEventListener('click', function(event){
   ... ...
})
  1. 事件对象只有有了事件才会存在,他是系统自动创建的,不需要我们传递参数
  2. 事件对象 是 我们事件一系列相关数据的集合,里面包含了很多属性和方法
  3. 这个事件对象我们可以自己命名,比如 event ,evt , e,

常用属性和方法:

  1. 返回触发事件的对象: e.target
  2. 返回触发的事件类型: e.type
  3. 阻止元素的默认行为
  • e.preventDefault(); // 阻止a标签跳转,阻止表单域跳转
  • return false; // 没有兼容性问题, 但是只限于传统注册方式, 且后面的代码不再执行;
  1. 阻止事件冒泡: e.stopPropagation();
  2. 禁用右键菜单: contextmenu (配合阻止默认行为使用);
  3. 禁止选中文字: selectstart (配合阻止默认行为使用);
  4. 获取鼠标在页面中的位置:
  • e.clientX; 鼠标在可视区域的X坐标值;
  • e.clientY; 鼠标在可视区域的Y坐标值;
  • e.pageX; 鼠标在文档页面的X坐标;
  • e.pageY; 鼠标在文档页面的Y坐标;
  1. 返回键盘的键值: e.key

环境对象

所有的函数内部都有一个特殊的变量this, 它代表着当前函数运行时所处的环境

函数的调用方式不同, this指代的对象也不同, 简单理解 [谁调用, this指向谁 ]

回调函数

把一个函数当做参数传递给另一个函数时, 这个函数就是回调函数

function fn() {  }
// fn就是回调函数
setInterval(fn, 1000)
  1. 5:事件委托: 不是每个子节点单独设置监听器,而是事件监听器设置在父节点上,然后影响冒泡原理影响子节点;
  2. 作用就是提高程序的性能,因为只操作一次DOM.

事件流

事件流就是事件完整执行的过程, 分为事件捕获阶段, 处于目标阶段, 事件冒泡阶段

事件捕获

从DOM的根元素开始执行事件(从大到小)

DOM.addEventListener(事件类型, 事件处理函数, 是否使用捕获机制)
  • 事件捕获很少使用, 所以默认参数是false, 代表事件在冒泡阶段触发
  • 若使用L0事件监听, 则只有冒泡阶段, 没有捕获
事件冒泡

当一个元素触发事件后, 会依次向上调用所有父级元素的同名事件

  1. 事件冒泡是默认存在的, 所以容易导致事件影响父级元素
  2. 如果需要把事件限制在当前元素生效, 就需要阻止事件冒泡
  3. 阻止事件冒泡需要拿到事件对象
  4. 事件对象.stopPropagation()
  5. 该方法可以阻断事件流动传播, 冒泡和捕获都会被阻止

事件委托

利用事件冒泡的特点, 把事件注册在父元素身上, 让子元素通过冒泡触发父元素的事件

  1. 好处: 减少事件注册, 提高程序性能
  2. 通过 事件对象.target.tagName 拿到真正触发事件的元素

其他事件

页面加载事件

有时候需要页面资源或者某些资源加载完毕后, 触发一些事件

// 页面加载完成
window.addEventListener('load', function(){ })

// 某个资源加载完成
img.addEventListener('load', function(){ })

// 页面DOM加载完成
// 速度更快
document.addEventListener('DOMContentLoaded', function(){ })
元素滚动事件

滚动条在滚动的时候持续触发的事件

// 页面滚动事件
window.addEventListener('scroll', function(){ })

// 元素滚动事件
div.addEventListener('load', function(){ })
  • 单纯的监听元素滚动, 不起什么作用, 通过要配合scroll相关的属性使用
页面尺寸事件

窗口尺寸改变的时候触发事件

window.addEventListener('resize',function(){
  // 检测屏幕宽度
  let w = document.documentElement.clientWidth
})

元素尺寸与位置

scroll家族

scroll翻译过来就是滚动的, 一般配合页面滚动使用, 用于获取元素被卷去的距离

  1. scrollTop 返回元素被卷去的上侧距离
  2. scrollLeft 返回元素被卷去的左侧距离
  3. scrollWidth 返回自身实际的宽度, 不含边框
  4. scrollHeight 返回自身实际的高度,不含边框
  5. scroll属性获取的数据都是可读写的, 返回值不带单位, 设置时也不用单位
  6. 设置页面滚动到指定位置 scrollTo(x, y)
window.addEventListener('scroll',function(){
  // 一般要写在页面滚动监听函数中
  const n = document.documentElement.scrollTop 
})

client属性

client是客户端的意思, 主要用于获取元素可视区的宽高

  1. clientTop 返回上边框的大小
  2. clientLeft 返回左边框的大小
  3. clientWidth 返回元素可视区的宽度
  4. clientHeight 返回元素可视区的高度
  5. 可视区就是只包含内容和padding, 不包含边框, margin, 滚动条
  6. client属性获取的数据不带单位, 只读属性
offset家族

offset翻译过来就是偏移量, 主要用来获取元素相对于父元素的位置 或者 元素的真实宽高

相关属性:

  1. offsetParent 返回该元素带有定位的父级元素,如果父级没有定位就往上一级找,直到bdoy;
  2. offsetTop 返回该元素距离带有定位的父元素的上方距离, 如果都没有定位, 以文档左上角为准
  3. offsetLeft 返回该元素距离带有定位的父元素的左侧距离, 如果都没有定位, 以文档左上角为准
  4. offsetWidth 返回自身的宽度 (包括padding, 边框, 内容)
  5. offsetHeight 返回自身的高度 (包括padding, 边框, 内容)
  6. offset属性获取到的数据都不带单位, 并且是只读属性

其他方法

获取元素的大小以及元素相对于视口的位置(不受父元素影响)

element.getBoundingClientRect()

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

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

相关文章

openlayer 图层点击事件 鼠标单击

背景: 接上一篇博客,如何渲染图层,渲染不同颜色的图层? 一个图层创建好了,接下来我们要做的是,如何通过鼠标点击打开点击对象的详情弹框?鼠标点击的是layer图层里的featrue要素,这…

数字AI化银行数字化转型实战手册银行数字化转型大客户营销销售讲师培训师唐兴通谈存量客户理财金融科技与场景化

推动银行数字化转型的五个关键因素 推动银行数字化转型的五个关键因素: 客户体验。为客户提供便利和个性化是数字化转型的关键因素。银行应开发和实施创新的数字渠道,例如移动应用程序、网上银行、聊天机器人等,以方便获取金融服务并提高客户…

使用微信开发者工具创建运行项目全流程

小程序基础知识 1. 认识什么是小程序 什么是微信小程序 微信小程序是一种运行在微信内部的 轻量级 应用程序。 在使用小程序时 不需要下载安装,用户 扫一扫 或 搜一下 即可打开应用。它也体现了 “用完即走” 的理念,用户不用关心安装太多应用的问题…

LangChain让LLM带上记忆

最近两年,我们见识了“百模大战”,领略到了大型语言模型(LLM)的风采,但它们也存在一个显著的缺陷:没有记忆。 在对话中,无法记住上下文的 LLM 常常会让用户感到困扰。本文探讨如何利用 LangCha…

2024-6-27 石群电路-31

2024-6-27,星期四,12:52,天气:雨,心情:晴。今天没有什么事情发生,继续学习,加油!!!!! 今日观看了石群老师电路课程的视频…

从此以后,将硬件接入大语言模型(LLM)将变得如此简单~

一、前言 本文中将使用ESP-AI开源库来实现将硬件接入AI,整个过程将非常的轻松~ 什么是ESP-AI? 为你的开发板提供全套的AI对话方案,包括但不限于 ESP32 系列开发板的 IATLLMTTS 集成方案。 交流群 QQ 交流群: 854445223 技术栈 ESP-AI 分为了服务端和…

Databend 怎么看 OpenAI 收购实时数仓 Rockset?

6月21日(上周五),OpenAI 官方宣布完成对实时分析数据库 Rockset 的收购,一时引起数据库圈和 AI 圈热议,很多朋友也来询问 Databend 如何看待这个事件。这次收购表明了市场对实时数据分析和数据处理解决方案的高度重视,数据是 AI 发…

Win10扩充C盘(把其他盘存储空间分给C盘)

C盘虽然没有安装任何软件,但无奈安装某些软件(例如VS,QuarC等)总会占用C盘容量,且C盘内存很小(只有60G左右),看着D盘的三四十空闲内存,决定把D盘内存分给C盘30G&#xff…

C++入门 list的模拟实现

目录 list的节点类 list的迭代器类 list的模拟实现 要模拟实现list,必须要熟悉list的底层结构以及其接口的含义,通过之前学习,这些内容已基本掌握,现在我们来模拟实现list。 参照带头双向循环链表的结构,我们可以建…

ConvMixer 论文与代码解析

paper:Patches Are All You Need? official implementation:https://github.com/locuslab/convmixer 精度上去了,推理速度只有卷积和ViTs的四分之一! 出发点 文章讨论了卷积神经网络(CNN)在视觉任务中…

#### 广告投放 ####

以巨量引擎为例: 计费模式 eCPM(expected Cost Per Mile,估计千次展示收入) 概括: ecpm为千次展示的预估收益,是广告平台用来给广告排序的指标。 注意是展示而不是千次点击收益,展示了可能不…

从0到1:亮数据浏览器,为数据采集工作注入全新动力

亮数据浏览器提升数据采集效率 一、 导言1.1 引入亮数据浏览器的重要性1.2 简要介绍本文将涉及的主题和内容 二、 亮数据浏览器简介2.1. 什么是亮数据浏览器2.2. 亮数据浏览器的特点和优势 三、优化数据采集的核心功能3.1 自动化数据采集3.1.1 通过亮数据浏览器实现自动化数据采…

LangChain入门之 GPT 和小范大人不太熟?

前言 嗨,大家好!我是海鸽。 《庆余年2》刚刚完结,热度不减,我忍不住好奇:我们的AI伙伴GPT,是否也对剧中那位机智过人的小范大人有所耳闻? 不仅如此,最近我们还尝试了LangChain的调…

Xcode安装Simulator失败问题解决方法

Xcode安装Simulator_Runtime失败,安装包离线安装保姆级教程 Xcode更新之后有时候会提示要安装模拟器运行时环境,但是用Xcode更新会因为网络原因,我觉得基本上就是因为苹果服务器的连接不稳定导致的,更可气的是不支持断点续…

介绍几种 MySQL 官方高可用方案

前言: MySQL 官方提供了多种高可用部署方案,从最基础的主从复制到组复制再到 InnoDB Cluster 等等。本篇文章以 MySQL 8.0 版本为准,介绍下不同高可用方案架构原理及使用场景。 1.MySQL Replication MySQL Replication 是官方提供的主从同…

记录dinky0.6.7+flink1.14.5集成问题

先说一句mmp,这个jar包冲突搞吐我。如果有遇到math3问题需要注意少个包 看相关issue 以下为flink的lib目录 一、yarn-application和perjob模式 yarn session模式不依赖dlink-app-1.14-0.6.7-jar-with-dependencies.jar这个包,。但是yarn-application…

新能源行业知识体系-------蒙西电网需求侧响应

新能源行业知识体系-------主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/139946830 目录 一、背景介绍二、需求响应电能量收益介绍三、超额回收需求响应减免收益介绍四、参与需求侧响应五、蒙西电力现货特点六、交易中…

1012:Joseph

网址如下&#xff1a; OpenJudge - 1012:Joseph 其中一个解法 只想到了一个快速找到下一位处决的人的方法&#xff0c;本质上还是遍历&#xff0c;暂时没想到更优的方法了 代码如下&#xff1a; #include<cstdio> int k;bool judge(int tt, int m, int r){if(tt k) …

GPU技术全景:推动未来计算的新动力-4

7.中国厂家 在中国市场&#xff0c;也有几家本土企业在GPU领域崭露头角&#xff0c;虽然市场份额相对较小&#xff0c;但在国产替代和自主可控的浪潮下发展迅速&#xff0c;包括但不限于&#xff1a; •沐曦集成电路、壁仞科技、燧原科技、登临科技、摩尔线程等&#xff0c…

信号处理——时频分析

经典傅里叶变换的限制&#xff1a; 1、只能反映信号的整体特性&#xff1b;&#xff08;完全是时域或频域&#xff09; 2、要求信号满足平稳条件&#xff1b; 3、必须获得时域中的全部信息。 所以引入时频分析&#xff0c;同时使用时间和频率的联合函数来表示信号。 1 时频…