JS学习第4天——事件高级(注册/删除事件、DOM事件流、阻止事件冒泡、事件委托、常用的鼠标/键盘事件)

news2024/9/24 9:23:06

目录

  • 一、注册事件 / 删除事件
    • 1、注册事件(绑定事件)
    • 2、删除事件(解绑事件)
  • 二、DOM事件流
  • 三、事件对象event
    • 1、事件对象的兼容性
    • 2、e.targent和this的区别
    • 3、事件对象常见的属性和方法
  • 四、阻止事件冒泡
  • 五、事件委托(代理、委托)
  • 六、常用的鼠标事件
    • 1、常用的鼠标事件
    • 2、禁止鼠标右键
    • 3、禁止鼠标选中
    • 4、鼠标事件对象
  • 七、常用的键盘事件
    • 1、常用的键盘事件
    • 2、键盘事件对象

一、注册事件 / 删除事件

1、注册事件(绑定事件)

注册事件的两种方式:传统方式和方法监听注册方式

注册事件方式方法特点
传统方式利用以on开头的事件注册事件具有唯一性,同一个元素同一个事件只能设置一个处理函数,后面的函数会覆盖前面的函数
方法监听注册方式addEventListener()方法同一个元素同一个事件可以注册多个监听器;IE9之前不支持,可使用attachEvent()代替

《1》addEventLsitener() 方法

eventTarget.addEventListener(type, listener[, useCapture]);

参数:
type:事件类型的字符串,不用加on(比如click、mouseover)
listener:事件处理函数
userCapture:可选参数,是一个布尔值,默认为false

《2》attachEvent()方法

eventTarget.attachEvent(eventNameWithOn, callback) 

参数:
eventNameWithOn:事件类型字符串,比如 onclick 、onmouseover ,这里要带 on
callback: 事件处理函数,当目标触发事件时回调函数被调用
注意:IE8 及早期版本支持

《3》注册事件兼容性解决方案

function addEventListener(element,eventName,fn) {
	if(element.addEventListener){
		element.addEventListener(eventName, fn); 
	}else if (element.attachEvent) {
		element.attachEvent('on' + eventName, fn)
	} else {
		element['on' + eventName] = fn;
	}
}

2、删除事件(解绑事件)

解绑方式方法
传统解绑方式eventTarget.onclick = null;
方法监听解绑方式eventTarget.removeEventListener(type, listener[, useCapture]);eventTarget.detachEvent(eventNameWithOn, callback);

《1》删除事件兼容性解决方案

function removeEventListener(element, eventName, fn) {
 // 判断当前浏览器是否支持 removeEventListener 方法
 if (element.removeEventListener) {
 element.removeEventListener(eventName, fn); // 第三个参数 默认是false
 } else if (element.detachEvent) {
 element.detachEvent('on' + eventName, fn);
 } else {
 element['on' + eventName] = null;
} 

二、DOM事件流

事件流:从页面中接收事件的顺序
DOM事件流:事件发生时会在元素节点之间按照特定的顺序传播,这个传播的过程即DOM事件流
在这里插入图片描述
比如我们给一个div 注册了点击事件:DOM 事件流分为3个阶段:① 捕获阶段 ② 当前目标阶段 ③ 冒泡阶段
事件冒泡:IE 最早提出,事件开始时由最具体的元素接收,然后逐级向上传播到到 DOM 最顶层节点的过程
事件捕获: 网景最早提出,由 DOM 最顶层节点开始,然后逐级向下传播到到最具体的元素接收的过程

注意
1、实际开发中更关注事件冒泡
2、JS代码中只能执行捕获或冒泡其中的一个阶段
3、onclick和attachEvent只能的到冒泡阶段
4、有些事件是没有冒泡的,比如 onblur、onfocus、onmouseenter、onmouseleave
5、addEventListener()第三个参数如果为true,表示在事件捕
获阶段调用事件处理程序;如果是 false,表示在事件冒泡阶段调用事件处理
6、 事件冒泡有时候会带来麻烦,有时候又会帮助很巧妙的做某些事件
程序。

三、事件对象event

事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象event,它有很多属性和方法

 eventTarget.onclick = function(event) {
 // 这个 event 就是事件对象,我们还喜欢的写成 e 或者 evt 
 }

event是一个形参,系统帮我们设为事件对象,不需要传递参实参;当我们注册事件时,, event 对象就会被系统自动创建,并依次传递给事件监听器(事件处理函数)

1、事件对象的兼容性

在IE6 ~ 8中,浏览器不会给方法传递参数,,需要到 window.event 中获取查找

// 解决方案
e = e || window.event

2、e.targent和this的区别

this 是事件绑定的元素, 这个函数的调用者(绑定这个事件的元素)
e.target 是事件触发的元素

3、事件对象常见的属性和方法

事件对象属性和方法说明
e.target 返回触发事件的对象
e.srcElement返回触发事件的对象 IE6~8常用
e.type返回事件的类型,比如click、mouseover 不带on
e.stopPropagation()阻止冒泡
e.cancelBubble阻止冒泡 IE6~8常用
e.preventDefault()阻止默认事件(默认行为),比如不让链接跳转
e.returnValue该属性阻止默认行为 IE6~8常用

四、阻止事件冒泡

《1》标准写法

e.stopPropagation() 

《2》IE6~8常用

e.cancelBubble = true;

《3》阻止事件冒泡兼容方案

if(e && e.stopPropagation){
 e.stopPropagation();
}else{
 window.event.cancelBubble = true;
}

五、事件委托(代理、委托)

《1》事件委托原理
不用给每个子节点单独设置事件监听器,而是将事件监听器设置在父节点上,然后利用冒泡原理影响每个子节点

(比如::给 ul 注册点击事件,然后利用事件对象的 target 来找到当前点击的 li,因为点击 li,事件会冒泡到 ul 上,ul 有注册事件,就会触发事件监听器)

《2》优点
这样只操作了一次DOM,提高程序的性能

六、常用的鼠标事件

1、常用的鼠标事件

onclick、onmouseover、onmouseout、onfocus、onblur、onmousemove、onmouseup、onmousedown

2、禁止鼠标右键

contextmenu主要控制何时显示上下文菜单,主要用于程序员取消默认的上下文菜单

document.addEventListener('contextmenu',function(e){
	e.preventDefault();
})

3、禁止鼠标选中

selectstart 开始选中

document.addEventListener('selectstart', function(e) {
	e.preventDefault();
})

4、鼠标事件对象

event对象代表事件的状态,跟事件相关的一系列信息的集合。现阶段我们主要是用鼠标事件对象MouseEvent键盘事件对象 KeyboardEvent

鼠标事件对象说明
e.clientX返回鼠标相对于浏览器窗口可视区域的 X 坐标
e.clientY返回鼠标相对于浏览器窗口可视区域的 Y 坐标
e.pageX返回鼠标相对于文档页面的 X 坐标 IE9+支持
e.pageY返回鼠标相对于文档页面的 Y 坐标 IE9+支持
e.screenX返回鼠标相对于电脑屏幕的 X 坐标
e.screenY返回鼠标相对于电脑屏幕的 Y 坐标

七、常用的键盘事件

1、常用的键盘事件

键盘事件对象触发条件
onkeyup某个键盘按键被松开时触发
onkeydown某个按键被按下时触发
onkeypress某个键盘按键被按下时并弹起时触发

注意:
onkeypress 和前面2个的区别是,它不识别功能键,比如左右箭头,shift 等
onkeydown 和 onkeyup 不区分字母大小写,onkeypress 区分字母大小写

2、键盘事件对象

键盘事件对象说明
keyCode返回该键的ASSII值

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

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

相关文章

数据采集与预处理学习

文章目录要求题解要求 根据表格求出哪两个演员合作电影数最多,及合作的电影数。 题解 from openpyxl import load_workbookwb load_workbook("电影导演演员信息表.xlsx") ws wb.worksheets[0]actors_films dict() for i, row in enumerate(ws.rows):i…

CAN总线开发一本全(4) - FlexCAN的驱动程序

CAN总线开发一本全(4) - FlexCAN的驱动程序 苏勇,2023年2月 文章目录CAN总线开发一本全(4) - FlexCAN的驱动程序引言从MindSDK获取FlexCAN驱动程序数据结构配置通信引擎的结构体类型访问MB的结构体类型配置ID过滤器的…

1 机器学习基础

1 机器学习概述 1.1 数据驱动的问题求解 大数据-Big Data 大数据的多面性 1.2 数据分析 机器学习:海量的数据,获取有用的信息 专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之…

Python多进程编程

一 多进程编程 Python实现多进程的方式有两种:一种方法是os模块中的fork方法,另一种是使用multiprocessing模块。 前者仅适用于LINUX/UNIX操作系统,对Windows不支持,后者则是跨平台的实现方式。 第一种方式:使用os模…

【C++修行之路】STL——模拟实现string类

文章目录前言类框架构造与析构c_str迭代器操作符重载[]&#xff1a;&#xff1a;> > < < !:reverse与resizereverseresizepush_back与append复用实现insert和erasec_str与流插入、流提取eraseswap(s1,s2)与s1.swap(s2)结语前言 这次我们分几个部分来实现string类…

spark第一章:环境安装

系列文章目录 spark第一章&#xff1a;环境安装 文章目录系列文章目录前言一、文件准备1.文件上传2.文件解压3.修改配置4.启动环境二、历史服务器1.修改配置2.启动历史服务器总结前言 spark在大数据环境的重要程度就不必细说了&#xff0c;直接开始吧。 一、文件准备 1.文件…

React Use Hook 尝鲜

React Use Hook 尝鲜 最近继续在找处理 React 异步调用的方式……主要是现在需求比较复杂&#xff0c;用 cache query 的方式去实现有那么一丢丢的麻烦&#xff0c;又不是很想用额外的包&#xff0c;所以就想看看有没有比较好的一些处理方式。 当然&#xff0c;可以用到生产环…

tkinter界面的TCP通信/tkinter开启线程接收TCP

前言 用简洁的语言写一个可以与TCP客户端实时通信的界面。之前做了一个项目是要与PLC进行信息交互的界面&#xff0c;在测试的时候就利用TCP客户端来实验&#xff0c;文末会附上TCP客户端。本文分为三部分&#xff0c;第一部分是在界面向TCP发送数据&#xff0c;第二部分是接收…

Linux基础命令-dd拷贝、转换文件

文章目录 dd 命令介绍 语法格式 基本参数 参考实例 1&#xff09;生成一个200M的新文件 2&#xff09;拷贝文件的100个字节 3&#xff09;将文件的字母全部转换成大写 4&#xff09;将linux自带的光盘制作成iso格式的镜像文件 5&#xff09;使用dd命令制作1G的交换分…

软考中级-操作系统

1 操作系统地位计算机系统由硬件和软件组成&#xff0c;未配置软件的称为裸机&#xff0c;但这会导致效率低下。操作系统是为弥补用户与硬件之间的鸿沟的一种系统软件&#xff0c;汇编、编译、解释、数据库管理系统等系统软件和其他应用软件都在此基础。2 进程管理又称处理机管…

Linux Ubuntu配置国内源

因为众所周知的原因&#xff0c;国外的很多网站在国内是访问不了或者访问极慢的&#xff0c;这其中就包括了Ubuntu的官方源。 所以&#xff0c;想要流畅的使用apt安装应用&#xff0c;就需要配置国内源的镜像。 市面上Ubuntu的国内镜像源非常多&#xff0c;比较有代表性的有清华…

pytorch学习日记之激活函数

常用的激活函数为S型&#xff08;sigmoid&#xff09;激活函数、双曲正切&#xff08;Tanh&#xff09;激活函数、线性修正单元&#xff08;ReLU&#xff09;激活函数等&#xff0c;对应Pytorch的函数如下所示 层对应的种类功能torch.nn.SigmoidSigmoid激活函数torch.nn.TanhT…

_vue-3

Vue3有了解过吗&#xff1f;能说说跟vue2的区别吗&#xff1f; 1. 哪些变化 从上图中&#xff0c;我们可以概览Vue3的新特性&#xff0c;如下&#xff1a; 速度更快体积减少更易维护更接近原生更易使用 1.1 速度更快 vue3相比vue2 重写了虚拟Dom实现编译模板的优化更高效的…

数据挖掘概述

目录1、数据挖掘概述2、数据挖掘常用库3、模型介绍3.1 分类3.2 聚类3.3 回归3.4 关联3.5 模型集成4、模型评估ROC 曲线5、模型应用1、数据挖掘概述 数据挖掘&#xff1a;寻找数据中隐含的知识并用于产生商业价值 数据挖掘产生原因&#xff1a;海量数据、维度众多、问题复杂 数…

直接拿项目运行npm start 会出现’react-scripts’ 不是内部或外部命令,也不是可运行的程序或批处理文件错误

目录 解决方案 原因 解决方案 npm install react-scripts或npm install安装完成后再次运行 npm start 即可 原因 create-react-app有丢包的缺陷&#xff0c;手动安装包后&#xff0c;需要重新npm install一下&#xff0c;这样node_modules/.bin/目录下才会重新出现react-s…

【论文阅读】基于LevelDB的分布式数据库研究

基于LevelDB的分布式数据库研究 基于LevelDB的分布式数据库的研究与实现 - 中国知网 (cnki.net) 实现了什么&#xff1f; 基于键值型NoSQL数据库LevelDB&#xff0c;并与数据一致性算法Raft、 数据分片和负载均衡相结合&#xff0c;设计并实现基于LevelDB的分布式数据库。 主要…

Wireshark “偷窥”浏览器与服务器三次握手

本文使用的是Wireshark 4.0.3, Java 11 编写简易服务器&#xff0c;客户端使用Chrome浏览器移动端开发或是前、后端开发又或是高大上的云计算都脱离不了网络&#xff0c;离开了网络的计算机就是一个孤岛&#xff0c;快速上手开发、背面试八股文固然有些急功近利&#xff0c;但确…

jstatd的启动方式与关闭方式

启动方式与注意事项&#xff1a; 启动方式&#xff1a; 前台启动不打印日志&#xff1a; jstatd -J-Djava.security.policyjstatd.all.policy -J-Djava.rmi.server.hostname服务器IP 前台启动并打印日志&#xff1a; ./jstatd -J-Djava.security.policyjstatd.all.policy -…

傻瓜式minio使用指南

傻瓜式minio使用指南1. docker部署minio1.1 docker拉取minio镜像1.2 创建docker容器1.3 查看docker容器是否启动正常2.登陆minio2.1 账户、密码为原先设置minioadmin2.2 创建桶2.3 设置桶属性3.Java客户端使用3.1引入依赖3.2 使用3.3 结果1. docker部署minio 1.1 docker拉取mi…

你应该知道的ChatGPT提示语

ChatGPT 自上线以来&#xff0c;凭借其优异的自然语言理解和输出能力&#xff0c;仅花 5天就成为了活跃用户过百万的现象级产品。而上一个现象级产品 instagram 花了 2 个半月。到目前为止 ChatGPT 在全球累计用户数量已经过亿&#xff0c;相信现在也有很多人在跟 ChatGPT 聊过…