【前端三剑客】JavaScript 网页脚本语言(Event 事件)

更新日期:2022/04/11
只要我们一起大笑,可怕的东西就会跑光光了。

 


1. Event 接口

Event 表示在 DOM 中出现的事件。一些事件是由用户触发的,例如鼠标或键盘事件;而其他事件常由 API 生成,例如指示动画已经完成运行的事件,视频已被暂停等等。事件也可以通过脚本代码触发,例如对元素调用 HTMLElement.click() 方法,或者定义一些自定义事件,再使用 EventTarget.dispatchEvent() 方法将自定义事件派发往指定的目标(target)。

  • Event 属性
    都是只读属性。
属性说明
bubbles一个布尔值,用来表示该事件是否会在 DOM 中冒泡
cancelable一个布尔值,表示事件是否可以取消
composed一个布尔值,表示事件是否可以穿过 Shadow DOM 和常规 DOM 之间的隔阂进行冒泡
currentTarget返回其事件监听器触发该事件的元素,它是有可能在重定向的过程中被改变的
defaultPrevented一个布尔值,表示 event.preventDefault() 方法是否取消了事件的默认行为
eventPhase返回事件传播的当前阶段
target返回触发此事件的元素(事件的目标节点)
timeStamp事件创建时的时间戳(精度为毫秒)
type事件的类型,不区分大小写
isTrusted表示事件是由浏览器(例如用户点击)发起的,还是由脚本(使用事件创建方法,例如 Event.initEvent)发出的
  • Event 方法
方法说明
composedPath()返回事件的路径
preventDefault()取消事件(如果该事件可取消)
stopImmediatePropagation()阻止监听同一事件的其他事件监听器被调用
stopPropagation()停止冒泡,阻止事件在 DOM 中继续冒泡

2. 使用事件句柄

addEventListener() 方法用于向指定元素添加事件句柄。
注意:不要使用 “on” 前缀。 例如:使用 “click” 而不是使用 “onclick”。

/*
type:表示监听事件类型的字符串。
listener: 必须是一个实现了 EventListener 接口的对象,或者是一个函数。
useCapture:是一个布尔值,用于描述事件是冒泡还是捕获。该参数是可选的。默认值为 false, 即冒泡传递。
*/
element.addEventListener(type, listener[, useCapture]);

使用 addEventListener 的时候,会发现没有反应,F12 打开控制台发现报错了:Uncaught TypeError: Cannot read properties of null (reading 'addEventListener') 无法读取空属性,显而易见,JavaScript 在文档没有加载完就调用导致没有获取到对象,所以要加上 onload 等页面载入完毕后再执行 Javascript 代码。

在这里插入图片描述

removeEventListener() 方法用来移除 addEventListener() 方法添加的事件句柄。
如果同一个监听事件分别为“事件捕获”和“事件冒泡”注册了一次,这两次事件需要分别移除。两者不会互相干扰。移除捕获监听器不会影响非捕获版本的相同监听器,反之亦然。

/*
type:表示要移除事件类型的字符串。
listener:需要从目标事件移除的 EventListener 函数。
useCapture:是一个布尔值,用于描述事件是冒泡还是捕获。该参数是可选的。默认值为 false, 即冒泡传递。
*/
element.removeEventListener(type, listener[, useCapture]);

addEventListener() 方法允许向同一个元素添加多个事件,且不会覆盖已存在的事件。下面的例子中,第二次点击将会取消第一次添加的监听,从随机数不再变化可以看出确实是取消了。

在这里插入图片描述

dispatchEvent() 方法用来向一个指定的事件目标派发一个事件, 并以合适的顺序同步调用目标元素相关的事件处理函数。
要向事件对象添加更多数据,可以使用 CustomEvent 接口,detail 属性可用于传递自定义数据。

// 新建事件
var event = new Event('build');
// 创建自定义事件并添加自定义数据
var customEvent= new CustomEvent('build', { 'detail': element.dataset.time });
// 监听事件
element.addEventListener('build', function (e) { ... }, false);
// 派发事件
element.dispatchEvent(event);

与浏览器原生事件不同,原生事件是由 DOM 派发的,并通过 event loop 异步调用事件处理程序,而 dispatchEvent() 则是同步调用事件处理程序。在调用 dispatchEvent() 后,所有监听该事件的事件处理程序将在代码继续前执行并返回。

在这里插入图片描述

2.1 事件监听回调

事件监听器可以被指定为回调函数或实现 EventListener 的对象,每当注册的事件发生的时候,handleEvent() 方法都会被调用(只要它拥有 handleEvent 方法)。
回调函数本身具有与 handleEvent() 方法相同的参数和返回值。

<script>
    onload = function () {
        const demo = document.getElementById("demo");
        const btn = document.getElementById("btn");
        
        let handleEvent = {
            name: "Ouseki ",
            handleEvent: function (e) {
                switch (e.type) {
                    case "click":
                        demo.innerHTML = "click event " + this.name + e.timeStamp;
                        break;
                    case "mouseover":
                        demo.innerHTML = "mouseover event " + this.name + e.timeStamp;
                        break;
                }
            }
        };

        btn.addEventListener('click', handleEvent, false);
        btn.addEventListener('mouseover', handleEvent, false);
    }
</script>

<div>
  <h3 id="demo">这是一个有趣的世界</h3>
  <button id="btn" type="button">尝试一下</button>
</div>

1. 普通函数中的 this 指向事件源。而实现 EventListener 接口对象的 this 指向对象本身;
2. handleEvent() 作为对象中的一个属性可以动态更改(重新赋值即可);
3. 还可以把不同事件的处理逻辑放到一起,根据事件类型区分,而不用为每个事件类型定义不同的处理函数了。因为处理逻辑都在同一对象中,也使程序更加“内聚”了。

在这里插入图片描述


3. 鼠标事件

事件句柄描述
click在元素上按下并释放任意鼠标按键
contextmenu右键点击(在右键菜单显示前触发)
dblclick在元素上双击鼠标按钮
mousedown在元素上按下任意鼠标按钮
mouseenter指针移到有事件监听的元素内
mouseleave指针移出元素范围外(不冒泡)
mousemove指针在元素内移动时持续触发
mouseover指针移到有事件监听的元素或者它的子元素内
mouseout指针移出元素,或者移到它的子元素上
mouseup在元素上释放任意鼠标按键
pointerlockchange鼠标被锁定或者解除锁定发生时
pointerlockerror可能因为一些技术的原因鼠标锁定被禁止时
select有文本被选中
wheel滚轮向任意方向滚动

4. 键盘事件

事件句柄描述
keydown按下任意按键
keypress除 Shift、Fn、CapsLock 外的任意键被按住(连续触发)
keyup释放任意按键

5. 拖放事件

事件句柄描述
drag正在拖动元素或文本选区(在此过程中持续触发,每 350ms 触发一次)
dragend拖放操作结束。(松开鼠标按钮或按下 Esc 键)
dragenter被拖动的元素或文本选区移入有效释放目标区
dragstart用户开始拖动 HTML 元素或选中的文本
dragleave被拖动的元素或文本选区移出有效释放目标区
dragover被拖动的元素或文本选区正在有效释放目标上被拖动 (在此过程中持续触发,每350ms触发一次)
drop元素在有效释放目标区上释放

6. 资源事件

事件句柄描述
error资源加载失败时
abort正在加载资源已经被中止时
load资源及其相关资源已完成加载
beforeunloadwindow,document 及其资源即将被卸载
unload文档或一个依赖资源正在被卸载

7. 网络事件

事件句柄描述
online浏览器已获得网络访问
offline浏览器已失去网络访问

8. 焦点事件

事件句柄描述
focus元素获得焦点(不会冒泡)
blur元素失去焦点(不会冒泡)

9. WebSocket 事件

事件句柄描述
openWebSocket 连接已建立
message通过 WebSocket 接收到一条消息
errorWebSocket 连接异常被关闭(比如有些数据无法发送)
closeWebSocket 连接已关闭

10. 会话历史事件

事件句柄描述
pagehide正在从一个会话历史条目中进行遍历
pageshow会话历史条目正在被遍历
popstate正在导航到会话历史条目(在某些情况下)

11. CSS 动画事件

事件句柄描述
animationstart某个 CSS 动画开始时触发
animationend某个 CSS 动画完成时触发
animationiteration某个 CSS 动画完成后重新开始时触发

12. CSS 过渡事件

事件句柄描述
transitionstart一个CSS转换实际上已经启动(在任何延迟之后触发)
transitioncancelCSS过渡被取消
transitionendCSS过渡已经完成
transitionrun一个CSS转换已经开始运行(在任何延迟启动之前触发)

13. 表单事件

事件句柄描述
reset点击重置按钮
submit点击提交按钮

14. 打印事件

事件句柄描述
beforeprint打印机已经就绪时触发
afterprint打印机关闭时触发

15. 文本写作事件

事件句柄描述
compositionstart准备好一段文本的组成(类似于键盘输入的 keydown,但可用于其他输入,如语音识别)
compositionupdate一个字符被添加到一段正在编写的文本中
compositionend文本的写作已完成或取消

16. 视图事件

事件句柄描述
fullscreenchange元素已切换到全屏模式或返回正常模式
fullscreenerror由于技术原因或权限被拒绝,无法切换到全屏模式
resize文档视图已调整大小
scroll文档视图或元素已滚动

17. 剪贴板事件

事件句柄描述
cut已经剪贴选中的文本内容并且复制到了剪贴板
copy已经把选中的文本内容复制到了剪贴板
paste从剪贴板复制的文本内容被粘贴

18. 媒体事件

事件句柄描述
audioprocessScriptProcessorNode的输入缓冲区已准备好被处理
canplay浏览器可以播放媒体,但估计没有加载足够的数据来播放媒体直到其结束,而不必为进一步缓冲内容而停止
canplaythrough浏览器估计它可以将媒体播放到最后,而不会因为内容缓冲而停止
complete终止对 OfflineAudioContext 的渲染
durationchange持续时间属性已被更新
emptied媒体已经变空;例如,如果媒体已经被加载(或部分加载),并调用 load() 方法重新加载,就会发送此事件
ended播放已经停止,因为已经到达媒体的终点
loadeddata媒体的第一帧已完成加载
loadedmetadata元数据已加载
pause播放已暂停
play播放已开始
playing在因缺乏数据而暂停或延迟后,播放已准备好开始
ratechange播放速率已更改
seeked一个查找操作完成
seeking开始了一次寻找行动
stalled用户代理正试图获取媒体数据,但数据意外地没有得到。
suspend媒体数据加载已暂停
timeupdatecurrentTime 属性指示的时间已更新
volumechange音量发生了变化
waiting由于暂时缺少数据,播放已停止

19. 进度事件

事件句柄描述
abort进度已终止(不是由于错误)
error进度失败
load进度顺利
loadend进度已经停止(在 “错误”、"中止 "或 "加载 "被派发后)
loadstart进度已经开始
progress正在进行中
timeout由于预设时间到期,进度终止

20. 存储事件

事件句柄描述
storage当存储区域(localStorage 或 sessionStorage)被修改时,将触发 storage 事件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值