当前位置: 首页 > 知识库问答 >
问题:

javascript - 事件冒泡是宏任务还是微任务,以及冒泡的触发时机?

井礼骞
2023-07-23

之所以想到这个问题,是因为在看一篇介绍事件循环的文章的一个例子

<div class="outer">  <div class="inner"></div></div>var outer = document.querySelector('.outer');var inner = document.querySelector('.inner');function onClick() {  console.log('click');    setTimeout(function() {    console.log('setTimeout');  }, 0);  Promise.resolve().then(function() {    console.log('new Promise');  });}inner.addEventListener('click', onClick);outer.addEventListener('click', onClick);

执行结果是

clicknew Promiseclicknew PromisesetTimeoutsetTimeout

关于事件循环、宏任务、微任务我已经比较了解。但是这些内容和事件冒泡、捕获的传递结合起来,之前没有考虑过。

文章开头介绍宏任务包括“UI交互事件”,所以点击事件是宏任务

但从执行结果来看,事件冒泡是属于微任务。当然,一个是事件的点击,一个是事件的传递,性质不同。不知道官方标准是怎么定义这部分内容的?另外,和这个有关的标准,是定义在JS,DOM?还是浏览器自己决定如何实现?

另外,关于冒泡的触发时机的问题,如下哪个先执行?

  • 执行inner的事件处理函数
  • 把 "click事件要冒泡" 添加到事件队列

共有1个答案

欧阳嘉年
2023-07-23

冒泡是否算执行任务?

理论来说,事件冒泡本身 不属于 宏任务或微任务,但事件的处理可以在宏任务或微任务中进行。

宏任务( macrotasks )和微任务( microtasks )都是 js 的 执行机制 中的概念,而事件冒泡是一个 事件模型

在 W3C 的事件模型中,当一个元素接收到事件的时候,会把它往上冒泡,会一直冒泡到 document 对象,这个行为本身和 js 无关,js 只负责捕获和处理

ECMAScript没有 明确定义事件处理过程中各个阶段(捕获、目标和冒泡)是否属于宏任务或微任务。

更何况不同浏览器对于冒泡执行顺序的定义也 不完全一致
不同浏览器事件冒泡

冒泡的触发时机?

如果题主特别感兴趣,推荐看后文参考第二篇 Jake Archibald 的文章,里面有对冒泡以及执行顺序的流程图,可以一步步自己调试

一般来说,冒泡按照捕获阶段、目标阶段和冒泡阶段的顺序依次触发相应的事件处理程序

当你点击元素时,监听事件捕获到后首先会添加一个执行冒泡点击元素的事件处理函数到任务队列,然后这个事件处理函数将在当前宏任务执行完后的下一个宏任务执行

但是冒泡是浏览器的 默认行为 ,并 不需要 添加到任务队列,它会立即开始,并在所有的同步任务完成后和下一个宏任务开始前完成。

所有监听器被触发是同步的,不会放到任务队列中,硬要说的话,冒泡过程和其对应的事件处理函数的触发是在 同一个 任务中完成的

参考
Flavio Copes - The JavaScript Event Loop
Jake Archibald - Tasks, microtasks, queues and schedules

下面这俩是油管视频,观看需要浅翻一下
Anjana Vakil - The JavaScript Event Loop: Explained
Philip Roberts - JSConf on the event loop

 类似资料:
  • 注意 目前仅 Weex Native(Android 和 iOS)支持,web 端 暂时不支持此项特性. 如果你是个 web 开发者,你大概对浏览器事件冒泡机制已经很熟悉了,而且可能认为 Weex 默认会支持事件冒泡。然而,Weex 在 0.13 之前是不支持这一特性的,在 0.13 版本,Weex 提供了这项支持。 概念 以点击事件为例,比如一个点击事件发生在某个 <video> 元素上,这个元

  • 本文向大家介绍详解javascript事件冒泡,包括了详解javascript事件冒泡的使用技巧和注意事项,需要的朋友参考一下 事件是javascript中的核心内容之一,在对事件的应用中不可避免的要涉及到一个重要的概念,那就是事件冒泡,在介绍事件冒泡之前,先介绍一下另一个重要的概念事件流: 一.什么是事件流: 文档对象模型(DOM)是一个树形结构,可以形象的用下图表示。 如果一个html元素触发

  • 问题内容: 事件冒泡和捕获之间有什么区别?什么时候应该使用冒泡与捕获? 问题答案: 事件冒泡和捕获是HTML DOM API中事件传播的两种方式,当事件发生在另一个元素内部的元素中,并且两个元素都已注册了该事件的句柄时。事件传播模式确定元素以什么顺序接收事件。 冒泡时,事件首先由最内层元素捕获和处理,然后传播到外层元素。 通过捕获,事件首先被最外面的元素捕获并传播到内部元素。 捕获也称为“滴答”,

  • 本文向大家介绍js事件委托以及冒泡原理?相关面试题,主要包含被问及js事件委托以及冒泡原理?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 事件委托是利用冒泡阶段的运行机制来实现的,就是把一个元素响应事件的函数委托到另一个元素,一般是把一组元素的事件委托到他的父元素上,委托的优点是 减少内存消耗,节约效率 动态绑定事件 事件冒泡,就是元素自身的事件被触发后,如果父元素有相同的事件,如onc

  • 主要内容:事件捕获,事件冒泡,阻止事件捕获和冒泡,阻止默认操作在 JavaScript 中,我们将事件发生的顺序称为“事件流”,当我们触发某个事件时,会发生一些列的连锁反应,例如有如下所示的一段代码: 如果给每个标签都定义事件,当我们点击其中的 标签时,会发现绑定在 和 标签上的事件也被触发了,这到底是为什么呢?为了解答这一问题,微软和网景两公司提出了两种不同的概念,事件捕获与事件冒泡: 事件捕获:由微软公司提出,事件从文档根节点(Document 对象)流

  • 本文向大家介绍javascript事件冒泡实例分析,包括了javascript事件冒泡实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript事件冒泡。分享给大家供大家参考。具体分析如下: 事件冒泡:   如果元素A嵌套在元素B中,那么A被点击不仅A的onclick事件会被触发,B的onclick也会被触发, 触发的顺序是"由内而外".验证:在页面上添加一个table,