执行模拟DOM事件的浏览器默认操作

时间:2013-11-27 12:50:46

标签: javascript events dom

我有一些代码通过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以触发默认操作(以及事件侦听器)时代码执行是否中断?

由于

1 个答案:

答案 0 :(得分:1)

因为JS不是多线程的,所以每次调度一个事件时它都会立即触发 - 实现不会创建一些事件队列,以便在下一个周期触发。

这是旧mutation events被弃用的原因之一。例如,如果向节点添加400个元素,它将触发400个突变事件(传播),从而减慢几乎所有内容。

因此,在您的代码片段中,循环的每次迭代都将创建鼠标事件,调度鼠标事件,处理鼠标事件的所有侦听器,然后继续执行循环的下一次迭代。