javascript - DOM 事件优先级

标签 javascript event-handling dom-events eventqueue

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

最佳答案

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

也就是说,HTML 5 draft recommendation确实尝试指定事件将如何排队和分派(dispatch) - the event loop :

To coordinate events, user interaction, scripts, rendering, networking, and so forth, user agents must use event loops as described in this section.

There must be at least one event loop per user agent, and at most one event loop per unit of related similar-origin browsing contexts.

An event loop has one or more task queues. A task queue is an ordered list of tasks [...] When a user agent is to queue a task, it must add the given task to one of the task queues of the relevant event loop. All the tasks from one particular task source must always be added to the same task queue, but tasks from different task sources may be placed in different task queues. [...]

[...]a user agent could have one task queue for mouse and key events (the user interaction task source), and another for everything else. The user agent could then give keyboard and mouse events preference over other tasks three quarters of the time, keeping the interface responsive but not starving other task queues, and never processing events from any one task source out of order. [...]

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

关于javascript - DOM 事件优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/282245/

相关文章:

javascript - 提交表单后如何在不刷新整个页面的情况下清除之前的文本字段值?

javascript - 使用 jQuery 进行表过滤

javascript - 如何检测用户使用的是手机、平板电脑还是台式机并重定向他们?

c++ - com 端口中的事件处理

javascript - 扫描元素类的所有 HTML,然后在该类上运行 javascript?

c# - 当触发另一个类的事件时通知

jquery解绑有必要吗? (替换元素)

javascript - Mobile Safari 有时不会触发点击事件

javascript - 事件—— 'mouseup' 鼠标移动后未触发

javascript - Javascript 事件处理最佳实践?