DOM事件总是运行单线程吗?

Ben*_*aum 6 javascript multithreading dom event-handling javascript-events

所以我最近回答了一个问题,OP问我是否可以将以下关于DOM事件添加到我的答案:

也许您还可以添加到您的答案中,不仅首先执行它们,而且后续事件将被阻止,直到第一个事件结束.

那么,我可以添加吗?我是否知道 DOM事件会一次运行一个事件并等待前一个事件在下一个事件开始之前完成?

我至少知道浏览器JavaScript总是这样吗?

到目前为止,找到一个确定的答案令人惊讶地难以实现,我期待"是",但我找不到它.


澄清:我不是要求在处理程序中添加其他异步处理程序,或者调用setTimeout或worker等.我要问的是,事件处理程序执行的顺序是否得到保证,下一个程序是否只启动了前一个执行完成的程序?一个好的答案会引用一个可靠的来源(最好是一个规范).没有关于穿线的事情.

Jua*_*des 5

是和否,所有JS都在同一个线程上运行,除了没有访问DOM的Web工作者.http://dev.opera.com/articles/view/timing-and-synchronization-in-javascript/

这是该页面上的一些相关信息

在处理下一个事件之前,所有事件处理函数都是按顺序执行的,并且每个事件都会被完全处理(包括通过DOM冒泡并执行默认操作).

但是,在那个页面的后面,他们提到了

比赛条件

每个窗口(和框架)都有自己的事件队列.在Opera中,每个窗口都有自己的JavaScript线程.这包括iframe中的窗口.结果是从不同帧启动的事件处理程序可能同时执行.如果这些同时脚本修改共享数据(如顶部窗口中的属性),我们就有可能出现竞争条件.

事件全部放入事件队列,所有事件处理都在同一个线程中发生.与所有异步回调一起,如XHR和setTimeout.

请注意嵌套事件,因为如果您触发事件并且它们可以更改全局状态,则会执行许多方法.示例http://jsfiddle.net/rpxZ4/

$('#d1').click(function(){
    alert('before ');
    $('#d2').trigger('click');
    $('#d3').trigger('click'); 
    alert('after ');
});

$('#d2, #d3').click(function() {
    alert('clicked ' +this.id);
});
Run Code Online (Sandbox Code Playgroud)

以下是Opera关于处理时序的建议

  • 没有长时间运行的脚本.
  • 不要使用同步XMLHttpRequests.
  • 不要让从不同帧启动的脚本操纵相同的全局状态.
  • 不要使用警报框进行调试,因为它们可能会完全改变程序的逻辑.