用户页面触发点击事件和 js 执行点击事件的区别

其实这个谜底揭开之后,第一反应都是,哦~,非常简单,但是细节决定成败,我被这个细节毁掉了,所以仅以此篇记录我这次的“折戟沉沙”

情景展示

情况一:用户点击页面触发

btn.addEventListener('click', () => {
	Promise.resolve().then(() => {
		console.log('microtask-1')
	})
	console.log('点击了1')
})

btn.addEventListener('click', () => {
	Promise.resolve().then(() => {
		console.log('microtask-2')
	})
	console.log('点击了2')
})

输出如图:

QQ202458-113949-HD-ezgif.com-video-to-gif-converter

情况二:通过 js 触发点击

btn.addEventListener('click', () => {
	Promise.resolve().then(() => {
		console.log('microtask-1')
	})
	console.log('点击了1')
})

btn.addEventListener('click', () => {
	Promise.resolve().then(() => {
		console.log('microtask-2')
	})
	console.log('点击了2')
})

btn.click()

输出结果如图:

image-20240508114239236

结果分析

情况一

两者不一致的原因其实也简单,用户点击触发的时候,并不在执行栈中发生具体的代码执行,仅仅是发送了一个点击事件而已,所以在第一个侦听器触发时,会打印点击1,然后将 microtask-1 加入微队列,图解如下:

image-20240508120140351

此时由于执行栈为空,那么就会立即取出微队列的任务进行执行,即输出microtask-1,第二个侦听器同理,打印点击了2,然后直接取出微任务执行,打印 microtask-2

情况二

通过 js 触发的点击事件,首先会在栈中加入一个 btn.click 的任务,执行侦听器1打印点击了1之后,就会把macrotask-1加入微队列,此时执行栈是存在任务的,所以不会直接取出微队列执行。

继续执行侦听器2,打印点击了2之后,将macrotask-2加入微队列,此时点击事件执行完成,执行栈就是空的,所以会直接取出微队列里面的任务执行,依次打印 macrotask-1、macrotask-2,图解如下:

image-20240508122255780

相关推荐

  1. vue触发真实 事件用户行为一致

    2024-05-13 00:12:07       21 阅读
  2. uni-app多次触发事件,防止重复

    2024-05-13 00:12:07       24 阅读
  3. 阻止div事件冒泡

    2024-05-13 00:12:07       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-13 00:12:07       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-13 00:12:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-13 00:12:07       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-13 00:12:07       20 阅读

热门阅读

  1. 为什么Redis6.0引入了多线程

    2024-05-13 00:12:07       12 阅读
  2. Hive优化(4)——数据倾斜优化

    2024-05-13 00:12:07       14 阅读
  3. (CDA数据分析师笔记)第六章 业务分析方法六

    2024-05-13 00:12:07       10 阅读
  4. GitFlow流程

    2024-05-13 00:12:07       9 阅读
  5. 数据结构之----栈与队列

    2024-05-13 00:12:07       11 阅读
  6. 链表所有节点和

    2024-05-13 00:12:07       8 阅读
  7. kotlin中协程相关

    2024-05-13 00:12:07       13 阅读
  8. Codeforces Round 944 (Div. 4)

    2024-05-13 00:12:07       10 阅读
  9. 1.下午试题1

    2024-05-13 00:12:07       10 阅读
  10. python自定义x坐标名称

    2024-05-13 00:12:07       8 阅读