javascript - dispatchEvent如何同步执行addEventListener的handler?
问题描述
let section = document.querySelector('section');
function handler(e) {
console.log(e.detail.color);
}
section.addEventListener('hello', handler);
let event = new CustomEvent("hello", {detail: {color: "red"}});
if (section.dispatchEvent(event)) {
console.log("true")
} else {
console.log("false");
}
<section></section>
在这个例子中,我很难理解handler
在文件的初始执行过程中是如何执行的——导致我们red
在true
. 我认为处理程序在某处等待事件,当事件发生时,它们被放入宏任务队列中,这意味着它们只会在文件初始执行后被放入调用堆栈。
我可以安全地假设它dispatchEvent
具有.addEventListener
同步执行处理程序的独特方式吗?
还是我对处理程序的.addEventListener
执行方式有误解?我认为它是异步执行的。
解决方案
我认为处理程序在某处等待事件
他们确实这样做了——但您只是碰巧立即触发了该事件,因此处理程序立即运行。
当事件发生时,它们被放入宏任务队列,这意味着它们只会在文件初始执行后被放入调用堆栈。
我不知道“文件的初始执行”是什么意思。每次调度事件时都会运行处理程序。
我是否可以安全地假设 dispatchEvent 具有同步执行 .addEventListener 处理程序的独特方式
不,这里没有发生任何奇怪的事情,这都是正常的事情。
还是我对 .addEventListener 中的处理程序的执行方式有误解?我认为它是异步执行的。
处理程序同步执行。每当调度事件时,都会检查处理程序,并且任何匹配的处理程序都会按照添加的顺序同步执行。
推荐阅读
- sql - 如果找到一个零,则 SQL 查询以排除每周数据
- c - 如何获取与正在搜索的项目匹配的所有 itams
- python - 无法将自定义函数的输出存储在 Python 的数据框中
- python-3.x - 如何使用 guiZero 获取画布当前大小
- python - 如何在python中使用openCv获取线的坐标
- node.js - Unable to Connect with MongoDB Atlas from Local Node App
- sql-server - 更新触发器导致 SQL 错误“找不到对象“XXX”,因为它不存在或您没有权限。”
- tsql - LTRIM 不会删除 SQL 中的前导空格
- c - 尝试链接目标文件时,编译 .asm 和 .c 文件会出现“i386 不兼容”问题
- azure - 同一消息的多个订阅者 Rebus Azure 服务总线