Javascript Keydown事件被触发两次

Javascript Keydown事件被触发两次,javascript,reactjs,Javascript,Reactjs,我正在处理文档上的按键事件,以便在按下ctrl+z时可以undo 以下是我将其与文档绑定的方式: componentWillMount() { window.addEventListener('keydown', throttle(this.handleKeyDown, 300)); } handleKeyDown(e) { if (e.ctrlKey && e.which === KEY_Z) { console.log('Undo'); } } 但只要

我正在处理文档上的按键事件,以便在按下
ctrl+z
时可以
undo

以下是我将其与文档绑定的方式:

componentWillMount() {
  window.addEventListener('keydown', throttle(this.handleKeyDown, 300));
}

handleKeyDown(e) {
  if (e.ctrlKey && e.which === KEY_Z) {
    console.log('Undo');
  }
}

但只要按下这些键,事件就会触发两次,这意味着它一次撤消两个状态。正如您所见,我还尝试使用lodash来限制事件,但没有效果。

您不会为按键组合获得一个事件,而是为每个按键触发一个事件。按下z键之前,ctrl键将自动触发事件。

您的标题是
keydown
,但您正在收听
keydup
。为什么要限制按键事件?那么,这两个回调调用是用同一个事件触发的吗?因为如果你在听ctrl+Z,那么你会听到ctrl和Z的组合。我的错是,我在最后一分钟修改了它进行测试。我要更新的是keydown。@kaido是的,在上面的例子中按下时,我会得到两个控制台日志。如果在
组件中添加一个console.log(“添加处理程序”),你会看到什么?如果只记录一次,请尝试
throttle(()=>{console.log(“throttle”)},300)(
。有没有解决此问题的方法?一种方法是使用keyDown和keydup事件处理程序记住Ctrl、Alt、Shift等键的状态。i、 e.在keyDown事件中将ctrKeyPressed设置为true(当e.ctrlKey为true时),并在keyUp事件中将其设置为false(当e.ctrlKey为true时),然后在z键的事件处理过程中组合该状态信息。