用户页面触发点击事件和 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

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
js页面跳转中触发事件的方法有多种。一种常见的方法是使用session来传递数据,并在新页面中根据传递的值进行相应的判断和触发事件。可以在第一个页面中将需要传递的值存储在sessionStorage中,然后在新页面中获取该值进行判断,并触发相应的事件。 另一种方法是使用单页面应用程序(SPA)的形式,使用框架如Vue-router来管理页面的跳转。在单页面应用中,当从一个页面跳转到另一个页面时,原页面的方法不会被重新执行。为了在路由变化时执行相应的方法,可以监听$route的变化,并在变化时触发相应的事件。这样可以实现在页面跳转时触发事件的效果。 总结起来,通过session传递值或使用单页面应用程序的方式,可以实现在js页面跳转时触发事件。具体的实现方法取决于你所使用的开发工具和框架。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [JS实现页面跳转并对新页面进行操作](https://blog.csdn.net/qq_65325072/article/details/124152729)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Vue 问题笔记 vue-router单页面应用跳转路由时触发事件](https://blog.csdn.net/weixin_33256233/article/details/117799585)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值