DOM 事件优先级

新手上路,请多包涵

在 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)。

原文由 dacracot 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 846
2 个回答

据我所知,这在过去并没有明确定义。不同的浏览器可以自由地实现他们认为合适的事件排序。虽然大多数对于所有实际目的都足够接近,但已经存在并将继续存在一些奇怪的边缘情况,其中浏览器有些不同(当然,还有更多情况是某些浏览器 根本 无法发送某些事件)。

也就是说, HTML 5 草案建议 确实尝试指定事件将如何排队和分派 - 事件循环

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

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

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

[…] 用户代理可以有一个任务队列用于鼠标和按键事件(用户交互任务源),另一个任务队列用于其他一切。然后,用户代理可以在四分之三的时间内将键盘和鼠标事件优先于其他任务,保持界面响应但不会使其他任务队列挨饿,并且永远不会无序地处理来自任何一个任务源的事件。 […]

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

原文由 Shog9 发布,翻译遵循 CC BY-SA 2.5 许可协议

对于任何想知道调用序列相关事件的人,请参见下文。到目前为止,我只在 Chrome 中进行过测试。

  1. 鼠标移到
  2. 鼠标移动
  3. 鼠标移开

  1. 鼠标按下
  2. 改变(在集中输入上)
  3. 模糊(在聚焦元素上)
  4. 重点
  5. 鼠标弹起
  6. 点击
  7. 双击

  1. 按键
  2. 按键
  3. 按键

原文由 Ricky Boyce 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题