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键的事件处理过程中组合该状态信息。