首页 > 解决方案 > 由`pointerdown`调度的`blur`事件是否保证在用户计划的任务之前触发?

问题描述

假设我有一个带有pointerdown(或mousedown)事件处理程序的按钮,我在其中通过setTimeout(与 无关delay)安排任务。

任务是否保证在由于事件而触发的事件之后执行?blurpointerdown

我浏览了UI 事件指针事件规范,但这对我没有帮助。

我的理解是,该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>

感觉答案将是“取决于用户代理(浏览器)”。

标签: javascriptdom-events

解决方案


在您的示例代码中,您只需删除onblur文本字段的处理程序并立即重新添加一个新的处理程序。


blur输入字段的事件(及其处理程序)或事件(及其处理程序)是否pointerdown被推送到事件循环可能取决于浏览器实现,因为可能未指定这种边缘情况。


推荐阅读