首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UI事件处理程序中的setTimeout宏任务

UI事件处理程序中的setTimeout宏任务
EN

Stack Overflow用户
提问于 2022-02-11 09:04:47
回答 1查看 65关注 0票数 0

我编写了以下简单的react组件

在onBlur事件处理程序中,我通过setTimeout创建了一个新的宏任务

代码语言:javascript
复制
function App() {
  const onBlur=()=>{
    console.log('onBlur')
    setTimeout(() => {
      console.log('setTimeout')
    }, 0);
  }

  const onClick=()=>{
    console.log('onClick')
  }
  
  return (
    <div className="App">
      <div id="first" onClick={onClick}>aaa</div>
      <div id="second" contentEditable onBlur={onBlur} suppressContentEditableWarning>qq</div>
    </div>
  );
}

然后

1、我将鼠标指针移动到第二个div。

2、,然后单击第一个div。

它在控制台中按以下顺序打印出来

onBlur

setTimeout

onClick

我的问题是为什么setTimeout显示在onClick之前;

请帮助我,非常感谢你的回答;

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-12 03:06:12

因为模糊事件是从mousedown事件触发的,而click事件是由mousedownmouseup组成的。

代码语言:javascript
复制
const d1 = document.querySelector("div");
const d2 = document.querySelector("div[contenteditable]");

d1.addEventListener("mousedown", ({type}) => { 
  console.log(type);
  setTimeout(() => console.log("timeout from %s", type), 0);
});
d1.addEventListener("click", ({type}) => console.log(type));
d1.addEventListener("mouseup", ({type}) => console.log(type));
d2.addEventListener("blur", ({type}) => {
  console.log(type);
  setTimeout(() => console.log("timeout from %s", type), 0);
});
d2.focus();

/* expected output:
mousedown
blur
timeout from mousedown
timeout from blur
mouseup
click
*/
代码语言:javascript
复制
<div>CLICK ME</div>
<div contenteditable>focused element</div>

因此,当您释放鼠标指针时,模糊事件已经被触发,0超时也有时间被执行,除非在Chrome中可以在小于1ms的时间内执行,在Chrome中,它们有1ms的最小超时时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71077488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档