Javascript 在另一个事件侦听器的回调中设置时,事件侦听器回调将立即激发。反应
通过createreact应用程序样板设置,我有一个输入字段,其中传递了onFocus事件。在这个onFocus回调中,我在window.document上设置了一个click eventlistener 当输入字段被聚焦时,为什么clickHandler回调会立即触发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
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
上。因此,您的单击被调用,因为当鼠标向上移动时,您的焦点处理程序被称为ndclick
事件已设置。我无法产生您在此处提到的问题。此外,您将侦听器添加到windows
而不是窗口。在focusHandler
函数中记录。当您将示例移到此处时,可能是输入错误?@devserkan是的,我现在已经输入了一个输入错误fixed@Panther是的,没错,拿着mo在不释放console的情况下使用down。仅记录焦点,释放时记录单击。干杯