Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在另一个事件侦听器的回调中设置时,事件侦听器回调将立即激发。反应_Javascript_Reactjs_Addeventlistener - Fatal编程技术网

Javascript 在另一个事件侦听器的回调中设置时,事件侦听器回调将立即激发。反应

Javascript 在另一个事件侦听器的回调中设置时,事件侦听器回调将立即激发。反应,javascript,reactjs,addeventlistener,Javascript,Reactjs,Addeventlistener,通过createreact应用程序样板设置,我有一个输入字段,其中传递了onFocus事件。在这个onFocus回调中,我在window.document上设置了一个click eventlistener 当输入字段被聚焦时,为什么clickHandler回调会立即触发 function App() { const clickHandler = (e) => { console.log("clicked"); window.document.removeEve

通过createreact应用程序样板设置,我有一个输入字段,其中传递了onFocus事件。在这个onFocus回调中,我在window.document上设置了一个click eventlistener

当输入字段被聚焦时,为什么clickHandler回调会立即触发

function App() {

  const clickHandler = (e) => {
      console.log("clicked");
      window.document.removeEventListener("click", clickHandler)
  } 

  const focusHandler = (e) => {
      console.log('onFocus');
      e.stopPropagation()
      window.document.addEventListener("click", clickHandler)  
  }

  return (
   <div className="App">
          <input onFocus={focusHandler} />
    </div>
  );
函数应用程序(){
常量clickHandler=(e)=>{
控制台日志(“单击”);
window.document.removeEventListener(“单击”,clickHandler)
} 
常数focusHandler=(e)=>{
console.log('onFocus');
e、 停止传播()
window.document.addEventListener(“单击”,clickHandler)
}
返回(
);

当您单击输入时,很少发生事件,例如
mousedown
mouseup
focus
click
(仅供参考-当mousedown和mouseup事件发生在同一元素上时发生click)。在chrome中,执行(如果处理程序存在)

现在,在你的代码中,当你点击输入时,
focusHandler
被执行,点击处理程序被连接到
窗口
。当js引擎完成执行
focusHandler
时,已经注册了一个点击处理程序。因此只要执行了
focusHandler
,js引擎就会意识到“啊,我需要一个clickHandler来执行它。让我来做。”因此,你的clickHandler会立即启动

您可以通过在setTimeout中附加事件处理程序来测试它。在下面的代码中,js引擎在
focusHandler
执行完成后没有clickHandler可执行。因此,click handler不会立即触发

const focusHandler=e=>{
console.log(“onFocus”);
e、 停止传播();
setTimeout(()=>window.addEventListener(“单击”,clickHandler),1000);
};

当您单击输入时,很少发生事件,例如
mousedown
mouseup
focus
click
(仅供参考-当mousedown和mouseup事件发生在同一元素上时发生click)。在chrome中,执行(如果处理程序存在)

现在,在你的代码中,当你点击输入时,
focusHandler
被执行,点击处理程序被连接到
窗口
。当js引擎完成执行
focusHandler
时,已经注册了一个点击处理程序。因此只要执行了
focusHandler
,js引擎就会意识到“啊,我需要一个clickHandler来执行它。让我来做。”因此,你的clickHandler会立即启动

您可以通过在setTimeout中附加事件处理程序来测试它。在下面的代码中,js引擎在
focusHandler
执行完成后没有clickHandler可执行。因此,click handler不会立即触发

const focusHandler=e=>{
console.log(“onFocus”);
e、 停止传播();
setTimeout(()=>window.addEventListener(“单击”,clickHandler),1000);
};

这是因为事件被触发的时间。
焦点
发生在鼠标按下的过程中。因此我们调用了函数处理程序。
单击
发生在
鼠标上
。因此,您的单击被调用,因为当鼠标向上移动时,您的焦点处理程序被调用,并且
单击
事件被设置。我无法预测roduce您在这里提到的问题。另外,您将侦听器添加到
windows
,而不是
window。在
focusHandler
函数中添加document
。当您将示例移到这里时,可能是一个输入错误?@devserkan yeah是我现在遇到的一个输入错误fixed@Panther是的,没错。按住鼠标但不释放console.log焦点和释放时记录单击。干杯这是因为事件被触发的时间。
focus
发生在鼠标按下的过程中。因此,我们调用了函数处理程序。
click
发生在
mouseup
上。因此,您的单击被调用,因为当鼠标向上移动时,您的焦点处理程序被称为nd
click
事件已设置。我无法产生您在此处提到的问题。此外,您将侦听器添加到
windows
而不是
窗口。在
focusHandler
函数中记录
。当您将示例移到此处时,可能是输入错误?@devserkan是的,我现在已经输入了一个输入错误fixed@Panther是的,没错,拿着mo在不释放console的情况下使用down。仅记录焦点,释放时记录单击。干杯