【发布时间】:2010-12-05 14:33:05
【问题描述】:
JavaScript 中的事件处理程序是作为 FIFO、LIFO 还是并行触发的?
【问题讨论】:
标签: javascript events internals
JavaScript 中的事件处理程序是作为 FIFO、LIFO 还是并行触发的?
【问题讨论】:
标签: javascript events internals
这很简单。 DOM 级别 2 事件模块 does not specify order 将在其中触发事件侦听器。但是,DOM Level 3 Events 模块does specify order要和注册一样一个。
先注册——先解雇。
请注意,DOM 3 级事件模块仍是草案,而 2 级是推荐。然而,现代浏览器通常完全遵循这个 3 级规范草案的语义,而不是旧的 2 级规范。
在实践中,IIRC,只有 IE 不尊重事件侦听器的顺序。所有其他浏览器将其实现为 FIFO(并且如 DOM L3 事件中所述)。你也可以找到related tests online :)
【讨论】:
由于 JavaScript 的单线程特性,事件和计时器会排队并按顺序依次执行,它们会在执行过程中出现空缺时运行。
最好用图表来说明这一点:
第一个块执行完毕后,有两个异步事件在等待,鼠标点击回调和定时器,浏览器选择鼠标点击 在本例中,计时器将等待到下一个可能的时间,以便执行。
查看 John Resig 关于Timers and Events 的这篇非常好的文章。
【讨论】:
PPK 有一篇关于事件冒泡和事件捕获的优秀文章。
【讨论】: