-
08-07-2019 - |
题
JavaScript 中事件处理的优先顺序是什么?
以下是按字母顺序排列的事件...
- onabort - 加载图像是 打断
- onblur - 元素失去焦点
- onchange - 用户将 字段的内容
- onclick - 鼠标单击一个对象
- ondblclick - 鼠标双击 对象
- onerror - 在以下情况下发生错误 加载文档或图像
- onfocus - 元素获得焦点
- OnKeyDown-按下键盘键
- onkeypress - 键盘键是 按下或按住
- OnKeyup-发布键盘键
- onload - 页面或图像是 完成装载
- onmousedown - 鼠标按钮是 压
- onmousemove - 鼠标被移动
- onmouseout - 鼠标已移开 元素
- onmouseover - 鼠标已移动 在元素上
- onmouseup - 鼠标按钮是 释放
- onReset-单击重置按钮
- onresize - 窗口或框架是 调整
- onselect - 文本被选择
- onsubmit - 提交按钮是 点击
- onunload - 用户退出页面
它们在事件队列中的处理顺序是什么?
我相信优先级不是先进先出(FIFO)。
解决方案
据我所知,这不是过去明确定义的。不同的浏览器可以自由地实现事件排序,但他们认为合适。虽然大多数都足够接近所有实际目的,但是一直存在并且仍然存在一些奇怪的边缘情况,其中浏览器有所不同(当然,在某些浏览器无法发送某些事件的情况下更多> )。
那就是 HTML 5草案建议确实试图指定事件将如何排队和分派 - 事件循环:
协调事件,用户 交互,脚本,渲染, 网络,等等,用户代理 必须使用事件循环,如中所述 这部分。
必须至少有一个事件循环 每个用户代理,最多一个事件 每单位相关的循环 类似来源的浏览环境。
事件循环有一个或多个任务 队列。任务队列是有序的 任务清单[...] 当用户代理要排队任务时, 它必须将给定的任务添加到其中一个 相关事件的任务队列 环。所有任务都来自一个 特定任务源必须始终如一 添加到同一个任务队列,但是 来自不同任务源的任务可能 被放置在不同的任务队列中。 [...]
[...]用户代理可以有一个任务队列 用于鼠标和键事件(用户 交互任务源),另一个 其他一切。用户代理 然后可以给键盘和鼠标 事件偏好优于其他任务 四分之三的时间,保持 界面响应但不是 饿死其他任务队列,永远不会 处理来自任何一项任务的事件 来源无序。 [...]
请注意最后一位:由浏览器实现决定哪些事件将按顺序组合在一起并按顺序处理,以及给予任何特定类型事件的优先级。因此,没有理由期望所有浏览器现在或将来以固定顺序发送所有事件。