【发布时间】:2017-04-01 11:35:52
【问题描述】:
SO question & answers 和 DOM level3 docs 声明 手动 事件在浏览器中同步 调度。然而,我的问题与用户相关的事件(实际点击)有关,而不是手动触发的。
我使用按钮 + onclick 处理程序创建了一个small jsfiddle demo,该处理程序执行一些同步工作 2 秒(阻塞同步等待,足够长的时间让我的眼睛可以看到发生了什么)。打开控制台查看console.logs。
测试。我在按钮上单击了几次。虽然第一次点击(及其同步处理)使按钮被按下(看起来像禁用),但其他点击也会被存储并稍后通过事件循环异步处理。
问题是:
- 事件分派究竟何时发生?用户事件(例如点击)是否立即推送到 JS 消息队列,或者是否存在中间 Web API 队列……或者换句话说 - 此事件调度与哪个队列相关?
- 如果发生用户事件(不是手动事件),大多数事件(
click、blur等 - 除了load)是什么意思?鉴于上面的测试,第一次点击会执行同步阻塞回调(我预计在此期间不会发生任何其他事情),无论如何,下一次点击都存储在队列中。所以存储事件无论如何都是并行的(必须是,因为主 javascirpt 线程很忙)。理论上,事件是异步处理的,会有什么区别吗?
slightly modified demo 表明对于给定的点击事件,该事件会冒泡并调用所有相关的事件处理程序,例如事件冒泡是否阻塞,直到发生其他任何事情(在本例中为超时)。但是仍然不清楚为什么事件调度是同步的。
【问题讨论】:
-
你有一个非常原始的“doNothing”实现。
-
有多少队列以及您是否将它们视为 Web API 的一部分或 JS 引擎的一部分将完全取决于实现。
-
您所说的“大多数事件在用户事件的情况下同步处理”是什么意思? 所有 JS代码被阻塞。
标签: javascript events asynchronous concurrency event-loop