javascript - 由`pointerdown`调度的`blur`事件是否保证在用户计划的任务之前触发?
问题描述
假设我有一个带有pointerdown
(或mousedown
)事件处理程序的按钮,我在其中通过setTimeout
(与 无关delay
)安排任务。
任务是否保证在由于事件而触发的事件之后执行?blur
pointerdown
我的理解是,该blur
事件只是在调用事件处理程序之前在事件循环上安排的另一个任务pointerdown
,因此,几乎可以保证任何用户安排的任务都会在事件触发后blur
触发。
请注意,“模糊事件触发”是指事件上发生的本机浏览器行为blur
(例如散焦输入),以及该事件上的用户注册事件处理程序blur
。请参见下面的示例:
window.btn.addEventListener("pointerdown", () => {
window.txt.onblur = null;
setTimeout(() => { // this should be invoked *after* the `blur` event
window.txt.onblur = () => { // this should never run when clicking on the button
console.log("blurred");
};
window.txt.focus();
});
});
<textarea id="txt"></textarea>
<button id="btn">focus</button>
感觉答案将是“取决于用户代理(浏览器)”。
解决方案
在您的示例代码中,您只需删除onblur
文本字段的处理程序并立即重新添加一个新的处理程序。
blur
输入字段的事件(及其处理程序)或事件(及其处理程序)是否pointerdown
被推送到事件循环可能取决于浏览器实现,因为可能未指定这种边缘情况。
推荐阅读
- jquery - 轮播项目在 Bootstrap 中没有水平显示
- java - Java中的堆栈溢出错误后如何进行堆转储?
- spring-boot - spring-boot 单元测试获取应用程序属性
- laravel - 此集合实例上不存在属性 [title]。拉拉维尔 5.6
- c# - Linq select distinct count 在内存中执行
- php - 如何在十月 CMS 中从 Twig 访问部分文件名?
- swift - swift 4 weak variable
- php - [PHP][MySQL] 如何在上传表单中为每个选中的文件实现一个标题字段?
- python - Surfaceplot 高度颜色
- php - Yii2 下拉选项组标签