javascript 如何避免在按住一个键时发生多个键向上/向下/按下事件?

unhi4e5o  于 2023-01-04  发布在  Java
关注(0)|答案(3)|浏览(120)

我正在创建一个Web前端来控制一个小型机器人, AJAX 调用将在keydown上进行,以启动机器人,并在keyup上停止机器人。
我的问题是,当一个键被按住时,keyupkeydownkeypress事件似乎不断地循环。有人知道一种方法吗?只有在第一次按下键时才触发keydown,而在释放键时才触发keyup
--edit:我本来忘了提,但我试过保存按钮的状态,问题是keydownkeypresskeyup事件在我按住键的时候一遍又一遍地触发。

iugsix8n

iugsix8n1#

我无法重现这个问题--无论我按住一个键多长时间,我都找不到从keydown抛出的keyup事件。
此方法侦听keydown,运行一些代码,并在侦听另一个keydown之前等待keyup。
警报仅在按键时调用。

var A=[], who=// I used a textarea, substititute your own target
who.onkeydown= who.onkeyup= function(e){
 e=window.event || e;
 var t= e.type, target= e.target || e.srcElement;
 A.push(t);
 if(t== 'keydown'){
  // start robot and stop listening to keydown
  target.onkeydown= '';
 }
 else if(t== 'keyup'){
  // stop robot and listen for keydown
  target.onkeydown= arguments.callee;
  alert(A)
 }
}
scyqe7ek

scyqe7ek2#

您可以尝试保存键的状态。当键按下时,检查是否已按下键,如果未按下,则启动机器人并将键标记为按下。如果已按下键,则不执行任何操作。在键打开时,执行相同的操作以停止机器人并将键标记为未按下。

0ejtzxu1

0ejtzxu13#

启动robot时,从keypress事件中移除事件处理程序,并为keyup事件添加一个事件处理程序以停止robot。
当keyup事件触发时,停止robot并重新添加按键处理程序。
编辑:实际上从你的keydown事件中删除事件处理程序。你会想使用keydown和keyup事件...而不是按键。
所以基本上
1.分配keydown事件处理程序
1.分配keyup事件处理程序
1.在keydown上,删除keydown事件处理程序并启动robot
1.在keyup上,重新分配keydown事件处理程序

相关问题