JavaScript处理事件的优先顺序是什么?
以下是按字母顺序排列的事件…
他们从事件队列中处理什么顺序?
我认为优先级不是先进先出(FIFO)。
据我所知,这在过去还没有明确定义。不同的浏览器可以随意实现事件排序,但是他们认为合适。尽管大多数浏览器对于所有实际目的来说都足够接近,但在某些情况下,并且仍然存在一些奇怪的情况,其中浏览器有所不同(当然,还有更多情况下某些浏览器根本无法发送某些事件)。
就是说,HTML 5建议草案确实尝试指定如何将事件排队和调度事件循环:
为了协调事件,用户交互,脚本,渲染,联网等,用户代理必须使用本节中描述的事件循环。 每个用户代理必须至少有一个事件循环,并且每个单位的相关相似起源浏览上下文最多应有一个事件循环。 一个事件循环具有一个或多个任务队列。任务队列是任务的有序列表。当用户代理要对任务进行排队时,它必须将给定任务添加到相关事件循环的任务队列之一中。必须始终将来自一个特定任务源的所有任务添加到同一任务队列中,但是可以将来自不同任务源的任务放在不同的任务队列中。[…] 一个用户代理可以有一个任务队列用于鼠标和按键事件(用户交互任务源),而另一个则用于其他所有任务。然后,用户代理可以在四分之三的时间中给予键盘和鼠标事件优先于其他任务的权限,使界面保持响应状态,但不会使其他任务队列饿死,并且永远不会乱序处理任何一个任务源的事件。[…]
为了协调事件,用户交互,脚本,渲染,联网等,用户代理必须使用本节中描述的事件循环。
每个用户代理必须至少有一个事件循环,并且每个单位的相关相似起源浏览上下文最多应有一个事件循环。
一个事件循环具有一个或多个任务队列。任务队列是任务的有序列表。当用户代理要对任务进行排队时,它必须将给定任务添加到相关事件循环的任务队列之一中。必须始终将来自一个特定任务源的所有任务添加到同一任务队列中,但是可以将来自不同任务源的任务放在不同的任务队列中。[…]
一个用户代理可以有一个任务队列用于鼠标和按键事件(用户交互任务源),而另一个则用于其他所有任务。然后,用户代理可以在四分之三的时间中给予键盘和鼠标事件优先于其他任务的权限,使界面保持响应状态,但不会使其他任务队列饿死,并且永远不会乱序处理任何一个任务源的事件。[…]
请注意最后一点:由浏览器实现确定哪些事件将被分组在一起并按顺序处理,以及赋予任何特定类型的事件的优先级。因此,没有理由期望所有浏览器现在或将来都以固定顺序调度所有事件。