【发布时间】:2013-09-20 20:27:02
【问题描述】:
所以我最近answered a question 并且 OP 询问我是否可以在我的答案中添加以下关于 DOM 事件的内容:
也许您还可以添加到您的答案中,不仅它们首先执行,而且后续事件会被阻止,直到第一个事件完成。
嗯,可以我补充一下吗?我是否知道 DOM 事件将一次运行一个事件并等待前一个事件完成后再开始下一个事件?
我至少知道在浏览器 JavaScript 中总是如此吗?
到目前为止,要找到一个确凿的答案非常困难,我本以为“是”,但我就是找不到。
澄清:我不是要在处理程序中添加其他异步处理程序,或者调用 setTimeout 或工作程序等。我要问的是是否保证事件处理程序执行的顺序,并且下一个仅开始前一个已完成执行?一个好的答案会引用一个可靠的来源(最好是一个规范)。这里没有关于线程的内容。
【问题讨论】:
-
取决于事件处理程序的作用。如果它推迟了新的脚本加载,则不必在下一个事件处理程序冒泡之前完成......即使只是一个 setTimeOut 也可以跳顺序。
-
当您添加脚本时,它也会等待轮到它运行。它不会破坏事件循环模型。如果您使用
setTimeout,您就是在故意操纵订单。请记住,setTimeout的第二个参数是尽力而为;如果您通过1000,则无法保证它会在 1 秒后运行。您会看到它经常出现偏差,尤其是在很长一段时间内。 -
是的,浏览器应该支持 JavaScript 代码中的单线程模型。 Web Workers 是并发运行代码的唯一方法。但是,我发现 Firefox 对此有一些错误。如果您正在发出 同步 ajax 请求,并且您还在侦听 websocket,那么即使您的 JavaScript 代码当前在 ajax 请求上被阻止,Firefox 也会在消息到达时错误地调用您的 websocket 消息处理程序。发生这种情况时,一切都会变得一团糟。
-
@Bergi 不,(我实际上在我链接的那个问题中引用了这个问题)。我要问的是 - DOM API 是否保证事件处理程序一个接一个地执行,并且仅在最后一个完成后才执行下一个?这与一般的 JS 或这种方式的计时器无关。这是关于 DOM 事件 api。
标签: javascript multithreading dom event-handling dom-events