我有一些代码通过DOM API(createEvent,initEvent,dispatchEvent等)触发/模拟DOM事件。对于大多数DOM事件,例如点击,有一个浏览器默认操作,如跟随链接。
由于JavaScript代码执行是单线程的,因此当我的代码在批处理中触发多个事件时,我不确定执行流程是怎样的。所以我假设我这样做(伪代码):
for (var i = 0; i < 10; i++) {
var event = document.body.createEvent('MouseEvent');
event.initMouseEvent(...);
document.body.dispatchEvent(event);
}
会发生什么?我的循环是否首先完全执行,然后处理所有事件,导致默认浏览器操作触发并注册事件监听器执行?或者,每次调用dispatchEvent以触发默认操作(以及事件侦听器)时代码执行是否中断?
由于
答案 0 :(得分:1)
因为JS不是多线程的,所以每次调度一个事件时它都会立即触发 - 实现不会创建一些事件队列,以便在下一个周期触发。
这是旧mutation events被弃用的原因之一。例如,如果向节点添加400个元素,它将触发400个突变事件(传播),从而减慢几乎所有内容。
因此,在您的代码片段中,循环的每次迭代都将创建鼠标事件,调度鼠标事件,处理鼠标事件的所有侦听器,然后继续执行循环的下一次迭代。