一尘不染

DOM事件优先级

javascript

JavaScript处理事件的优先顺序是什么?

以下是按字母顺序排列的事件…

  1. onabort-图像加载中断
  2. onblur-元素失去焦点
  3. onchange-用户更改字段的内容
  4. onclick-鼠标单击对象
  5. ondblclick-鼠标双击一个对象
  6. onerror-加载文档或图像时发生错误
  7. onfocus-元素获得焦点
  8. onkeydown-按下键盘键
  9. onkeypress-按下或按住键盘键
  10. onkeyup-释放键盘键
  11. onload-页面或图像加载完成
  12. onmousedown-按下鼠标按钮
  13. onmousemove-鼠标移动
  14. onmouseout-鼠标移出元素
  15. onmouseover-鼠标移到元素上
  16. onmouseup-释放鼠标按钮
  17. onreset-单击重置按钮
  18. onresize-调整窗口或框架的大小
  19. onselect-已选择文本
  20. onsubmit-单击提交按钮
  21. onunload-用户退出页面

他们从事件队列中处理什么顺序?

我认为优先级不是先进先出(FIFO)。


阅读 634

收藏
2020-05-01

共1个答案

一尘不染

据我所知,这在过去还没有明确定义。不同的浏览器可以随意实现事件排序,但是他们认为合适。尽管大多数浏览器对于所有实际目的来说都足够接近,但在某些情况下,并且仍然存在一些奇怪的情况,其中浏览器有所不同(当然,还有更多情况下某些浏览器根本无法发送某些事件)。

就是说,HTML 5建议草案确实尝试指定如何将事件排队和调度事件循环:

为了协调事件,用户交互,脚本,渲染,联网等,用户代理必须使用本节中描述的事件循环。

每个用户代理必须至少有一个事件循环,并且每个单位的相关相似起源浏览上下文最多应有一个事件循环。

一个事件循环具有一个或多个任务队列。任务队列是任务的有序列表。当用户代理要对任务进行排队时,它必须将给定任务添加到相关事件循环的任务队列之一中。必须始终将来自一个特定任务源的所有任务添加到同一任务队列中,但是可以将来自不同任务源的任务放在不同的任务队列中。[…]

一个用户代理可以有一个任务队列用于鼠标和按键事件(用户交互任务源),而另一个则用于其他所有任务。然后,用户代理可以在四分之三的时间中给予键盘和鼠标事件优先于其他任务的权限,使界面保持响应状态,但不会使其他任务队列饿死,并且永远不会乱序处理任何一个任务源的事件。[…]

请注意最后一点:由浏览器实现确定哪些事件将被分组在一起并按顺序处理,以及赋予任何特定类型的事件的优先级。因此,没有理由期望所有浏览器现在或将来都以固定顺序调度所有事件。

2020-05-01