事件代理(事件捕获)

 2025-09-06 14:09:02  阅读 530  评论 0

摘要:前言 上图是W3C标准的DOM事件流模型图,从图中可以看出,元素事件响应在DOM树中是从顶层的Window开始“流向”目标元素,然后又从目标元素“流向”顶层的Window通常,我们将这种事件流向分为三个阶段:捕获阶段,目标阶段,冒泡阶段1.捕获阶段是指事件响应从最外层的Window开始

事件捕获、事件冒泡以及事件代理

前言

上图是W3C标准的DOM事件流模型图,从图中可以看出,元素事件响应在DOM树中是从顶层的Window开始“流向”目标元素,然后又从目标元素“流向”顶层的Window

通常,我们将这种事件流向分为三个阶段:捕获阶段,目标阶段,冒泡阶段

1.捕获阶段是指事件响应从最外层的Window开始,逐级向内层前进,直到具体事件目标元素。在捕获阶段,不会处理响应元素注册的冒泡事件。

2.目标阶段指触发事件的最底层的元素,如上图中的。

3.冒泡阶段与捕获阶段相反,事件的响应是从最底层开始一层一层往外传递到最外层的Window。

现在,我们就可以知道,DOM事件流的三个阶段是先捕获阶段,然后是目标阶段,最后才是冒泡阶段。我们时常面试所说的先捕获后冒泡也由此而来。事件代理就是利用事件冒泡或事件捕获的机制把一系列的内层元素事件绑定到外层元素

事件冒泡和事件捕获

实际操作中,我们可以通过 element.addEventListener() 设置一个元素的事件模型为冒泡事件或者捕获事件。先来看一下 addEventListener 函数的语法:

element.addEventListener(type, listener, useCapture)
// type 监听事件类型的字符串
// listener 事件监听回调函数,即事件触发后要处理的函数
// useCapture 默认值false,表示事件冒泡;设为true时,表示事件捕获

事件冒泡举例

a
b
c

冒泡事件的执行顺序为:c -> b -> a

事件捕获举例

a
b
c

捕获事件的执行顺序为:a -> b -> c

事件捕获VS事件冒泡

我们将上述的代码a,b,c三个元素都注册捕获和冒泡事件,并以元素c作为触发事件的主体,即事件流中的目标阶段。

a
b
c

执行顺序为:捕获a -> 捕获b -> 冒泡c -> 捕获c -> 冒泡b -> 冒泡a

从执行结果可以看到,a,b两个元素的事件响应都是先捕获后冒泡的,但对于触发事件的目标元素c,事件的响应并没有遵循先捕获后冒泡的规则,这是为什么?因为目标元素是事件触发主体处于事件流中的目标阶段,处理事件的顺序是根据注册顺序来执行的。

事件代理(事件委托)

我们知道了事件冒泡和事件捕获的原理,那么对于事件委托就比较容易理解了。重复一遍,事件代理就是利用事件冒泡或事件捕获的机制把一系列的内层元素事件绑定到外层元素。至于为什么通常我们说事件代理是利用事件冒泡的机制来实现的,只是大家习以为常而已。

//div
  • item1
  • item2
  • item3
  • item4
//js var items = document.getElementById('item-list'); //事件捕获实现事件代理 items.addEventListener('click', (e) => {console.log('捕获:click ',e.target.innerHTML)}, true); //事件冒泡实现事件代理 items.addEventListener('click', (e) => {console.log('冒泡:click ',e.target.innerHTML)}, false);

对于上述的列表元素,我们希望将用户点击了哪个item打印出来,通常我们可以给每个item注册点击事件监听器,但是需要对每个元素进行事件监听器的注册;但是通过事件代理,我们可以将多个事件监听器减少为一个,这样就减少代码的重复编写了。利用事件冒泡或事件捕获实现事件代理

事件代理既可以通过事件冒泡来实现,也可以通过事件捕获来实现。

总结

DOM事件流有3个阶段:捕获阶段,目标阶段,冒泡阶段;三个阶段的顺序为:捕获阶段——目标阶段——冒泡阶段;对于非目标阶段的元素,事件响应执行顺序遵循先捕获后冒泡的原则;通过暂缓执行捕获事件,可以达到先冒泡后捕获的效果;对于目标元素,事件响应执行顺序根据的事件的执行顺序执行;事件捕获是从顶层的Window逐层向内执行,事件冒泡则相反;事件委托(事件代理)是根据事件冒泡或事件捕获的机制来实现的。

版权声明:我们致力于保护作者版权,注重分享,被刊用文章【事件代理(事件捕获)】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!;

原文链接:https://www.yxiso.com/zhishi/2133416.html

标签:事件代理

发表评论:

关于我们
院校搜的目标不仅是为用户提供数据和信息,更是成为每一位学子梦想实现的桥梁。我们相信,通过准确的信息与专业的指导,每一位学子都能找到属于自己的教育之路,迈向成功的未来。助力每一个梦想,实现更美好的未来!
联系方式
电话:
地址:广东省中山市
Email:beimuxi@protonmail.com

Copyright © 2022 院校搜 Inc. 保留所有权利。 Powered by BEIMUCMS 3.0.3

页面耗时0.0347秒, 内存占用1.93 MB, 访问数据库24次

陕ICP备14005772号-15