HTML:事件代理和事件委托的区别

事件代理和事件委托是一个东西只是叫法不同而已

了解事件代理之前首先要了解事件流机制,事件代理就是利用了事件流中的事件冒泡的特性

事件机制

事件触发会经历两个阶段:捕获阶段和冒泡阶段。这两个阶段构成了事件流,决定了事件的传播和处理顺序。

事件机制的触发的是三个阶段:

  1. 捕获阶段(Capture Phase):
    • 事件从最外层的祖先元素逐级向下传播到目标元素。
    • 在捕获阶段,如果父元素上有addEventListener事件监听器,它会在目标元素触发之前被触发。
  2. 目标阶段(Target Phase):
    • 事件到达目标元素时触发。
    • 在目标阶段,触发绑定在目标元素的addEventListener事件监听器
  3. 冒泡阶段(Bubbing Phase):
    • 事件从目标元素开始向上传播到最外层的组件元素。
    • 在冒泡阶段,如果父元素上有addEventListener事件监听器,它会在目标元素触发之后被触发

tips:并非所有事件都支持捕获阶段。一些常见的事件(如鼠标点击事件)只支持冒泡阶段。

什么是事件冒泡?

当一个元素执行某类型事件,从该元素开始逐层向外层元素检查是否有该类事件,有则触发,没有就继续向上查找,直到Document为止。

什么是事件捕获?

事件捕获则是和事件冒泡相反,当一个元素触发某类型事件时,从这个元素的根节点开始逐级向里查找,有则触发,没有就继续向里查找,直到触发该事件的元素为止。

事件冒泡和事件捕获的区别

事件冒泡是从元素本身开始,逐级向上寻找同类型事件并执行,一直到document为止。事件捕获是从document开始,逐级向下寻找同类型事件,并执行,一直到触发该事件的元素为止。

addEventListener函数

根据上面的了解,事件流的三个阶段 :捕获阶段 >> 目标阶段 >> 冒泡阶段 所以一次事件当执行,是走以下流程的:先进行事件捕获,再到事件本身,最后进行事件冒泡

难道每一个事件都要把冒泡和捕获都走一遍嘛?其实不是的,事件冒泡和事件捕获本身不会主动触发事件,需要我们决定在哪个阶段执行,通过使用addEventListener函数来决定事件发生的位置

javascript 复制代码
 addEventListener(eventType,function,bool)
//eventtype:事件类型
//function:事件函数
//bool:true或false

addEventListener函数有三个参数:

1,eventType 事件类型("click之类的")

2,function 触发事件后所需要执行的函数

3,bool 入参true/false,决定事件在冒泡阶段执行还是捕获阶段执行。 true表示事件在捕获阶段执行,false表示事件在冒泡阶段执行。默认值是false

事件代理的作用和应用

事件代理的作用就是避免大量事件注册,提高性能,在工作中当大量子级元素需要绑定一个相同的事件时就可以把它们的事件绑定在它们的父级身上通过事件代理的方式去减少时间的注册

事件代理的优点和局限性

优点:

1,可以大量节省内存占用,减少事件注册,比如在ul上代理所有li的click事件

2,可以实现当新增子对象时无需再次对其绑定(动态绑定事件)

局限性:

1,focus 、 blur 这些事件没有事件冒泡机制,所以⽆法进⾏委托绑定事件

2,mousemove 、 mouseout 这样的事件,虽然有事件冒泡,但是只能不断通过位置去计算定位, 对性能消耗⾼,因此也是不适合于事件委托的

相关推荐
崔庆才丨静觅4 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60615 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了5 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅5 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅5 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅6 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment6 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅6 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊6 小时前
jwt介绍
前端
爱敲代码的小鱼6 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax