事件高级
一、注册事件(绑定事件)
(一)注册事件概述
● 给元素添加事件,称为注册事件或者绑定事件
● 注册事件有两种方式:传统方式和方法监听注册方式
1、传统注册方式
(1)利用 on 开头的事件 onclick
(2)<button onclick = "alert('hi~')"></button>
(3)btn.onclick = function() {}
(4)特点:注册事件的唯一性
(5)同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数
2、方法监听注册方式
(1)w3c标准推荐方式
(2)addEventListener() 它是一个方法
(3)IE9 之前的IE 不支持此方法,可使用 attachEvent() 代替
(4)特点:同一个元素同一个事件可以注册多个监听器
(5)按注册顺序依次执行
(二)addEventListenner 事件监听方式
1、eventTarget.addEventListener(type, listener[, useCapture])
2、eventTarget.addEventListener() 方法将指定的监听器注册到eventTarget (目标对象) 上,当该对象触发指定的事件时,就会执行事件处理函数。
3、该方法接收三个参数:
● type:事件类型字符串,比如 click、mouseover,注意这里不要带 on
● listener:事件处理函数,事件发生时,会调用该监听函数
● useCapture:可选参数,是一个布尔值,默认是 false。
(三)attachEvent 事件监听方式
1、eventTarget.attachEvent(eventNameWithon, callback)
2、eventTarget.attachEvent() 方法将指定的监听器注册到 eventTarget(目标对象) 上,当该对象触发指定的事件时,指定的回调函数就会被执行
3、该方法接收两个参数:
(1)eventNameWithon:事件类型字符串,比如onclick、onmouseover,这里要带 on
(2)callback:事件处理函数,当目标触发事件时回调函数被调用
二、删除事件(解绑事件)
(一)删除事件的方式
1、传统注册方式
evenTarget.onclick = null;
2、方法监听注册方式
(1)eventTarget.removeEventListener(type, Listener[, useCapture]);
(2)eventTarget.detachEvent(eventNameWithOn, callback);
三、DOM事件流
1、事件流描述的是从页面中接收事件的顺序
2、事件发生时会给在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流
3、比如我们给一个div注册了点击事件:
DOM事件流分为3个阶段:
(1)捕获阶段
(2)当前目标阶段
(3)冒泡阶段
4、事件冒泡:IE 最早提出,事件开始时由最具体的元素接收,然后逐级向上传播到DOM最顶层节点的过程
5、事件捕获:网景最早提出,由DOM最顶层节点开始,然后逐级向下传播到最具体的元素接收的过程
6、注意:
(1)JS 代码中只能执行捕获或者冒泡其中的一个阶段
(2)onclick 和 attachEvent 只能得到冒泡阶段
(3)addEventListener(type, listener[, useCapture])第三个参数如果是 true,表示在事件捕获阶段调用事件处理程序;如果是false(不写默认就是false),表示在事件冒泡阶段调用事件处理程序。
(4)实际开发中我们很少使用事件捕获,我们更关注事件冒泡
(5)有些事件是没有冒泡的,比如 onblur、onfocus、onmouseenter、onmouseleave
(6)事件冒泡有时候会带来麻烦,有时候又会帮助很巧妙的做某些事件
四、事件对象
(一)什么是事件对象
1、官方解释:event对象代表事件的状态,比如键盘按键的状态、鼠标的位置、鼠标按钮的状态
2、简单理解:事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象event,它有很多属性和方法
(二)事件对象的使用语法
1、这个event 是个形参,系统帮我们设定为事件对象,不需要传递实参过去
2、当我们注册事件时,event对象就会被系统自动创建,并依次传递给事件监听器(事件处理函数)
(三)事件对象的兼容性方案
事件对象本身的获取存在兼容问题:
1、标准浏览器中是浏览器给方法传递的参数,只需要定义形参 e 就可以获取到
2、在IE6~8中,浏览器不会给方法传递参数,如果需要的话,需要到window.event 中获取查找。
3、解决:
e = e || window.event;
(四)事件对象的常见属性和方法
事件对象属性方法 | 说明 |
e.target | 返回触发事件的对象 标准 |
e.srcElement | 返回触发事件的对象 非标准 ie6-8使用 |
e.type | 返回事件的类型 比如 click mouseover 不带on |
e.canceBubble | 该属性 阻止冒泡 非标准 ie6-8使用 比如不让链接跳转 |
e.returnValue | 该属性阻止默认事件(默认行为)非标准 ie6-8使用 比如不让链接跳转 |
e.preventDefault() | 该方法阻止默认事件(默认行为)标准 比如不让链接跳转 |
e.stopPropagation() | 阻止冒泡 标准 |
五、阻止事件冒泡
(一)阻止事件冒泡的两种方式
事件冒泡:开始时由最具体的元素接收,然后逐级向上传播到DOM最顶层节点
事件冒泡本身的特性,会带来的坏处,也会带来的好处,需要我们灵活掌握
1、阻止事件冒泡
(1)标准写法:利用事件对象里面的 stopPropagation() 方法
e.stopPropagation()
(2)非标准写法:IE6-8 利用事件对象cancelBubble 属性
(二)阻止事件冒泡的兼容性解决方案
六、事件委托(代理、委派)
1、事件委托
事件委托也称为事件代理,在jQuery里面称为事件委派
2、事件委托的原理
不是每个子节点单独设置事件监听器,而是事件监听器设置在其父节点上,然后利用冒泡原理影响设置每个子节点
3、事件委托的作用
我们只操作了一次DOM,提高了程序的性能
七、常用的鼠标事件
(一)常用的鼠标事件
鼠标事件 | 触发条件 |
onclick | 鼠标点击左键触发 |
onmouseover | 鼠标经过触发 |
onmouseout | 鼠标离开触发 |
onfocus | 获取鼠标焦点触发 |
onblur | 失去鼠标焦点触发 |
onmousemove | 鼠标移动触发 |
onmouseup | 鼠标弹起触发 |
onmousedown | 鼠标按下触发 |
(二)鼠标事件对象
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 | 某个键盘按键被按下时触发 但是它不识别功能键 比如 Ctrl shift 箭头等 |
2、注意:
(1)如果使用addEventListener 不需要加on
(2)onkeypress 和前面2个的区别是,它不识别功能键,比如左右箭头,shift等
(3)三个事件的执行顺序是:keydown -- keypress -- keyup
(二)键盘事件对象
键盘事件对象属性 | 说明 |
keyCode | 返回该键的ASCII值 |
注意:
1、onkeydown 和 onkeyup 不区分字母大小写,onkeypress 区分字母大小写
2、在我们实际开发中,我们更多的使用keydown和keyup,它能识别所有的键(包括功能键)
3、keypress 不识别功能键,但是keyCode属性能区分大小写,返回不同的ASCII值
(三)ASCII 表
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2020-08-26 路径