Javascript 区分按下的键和保持的键

Javascript 区分按下的键和保持的键,javascript,jquery,keystroke,Javascript,Jquery,Keystroke,我有一个javascript函数,它在按下“向下”键时运行。我想,如果按下“向下”键,该功能将根本无法运行 我考虑了keydown和keyup之间的计时,如果时间小于1秒,那么函数将在keyup上运行。问题是,如果我按住该键,浏览器会将其视为连续多次按下的键 有更好的方法吗 谢谢也许你可以在按下键时触发一个计数器,然后收听下一个按键。只要计数器超过5秒,或者无论您认为需要多长时间,您都可以启动该功能。有意义吗?连续的向下键不会触发向上键,因此可以区分它们 $('body').keydown(函

我有一个javascript函数,它在按下“向下”键时运行。我想,如果按下“向下”键,该功能将根本无法运行

我考虑了keydown和keyup之间的计时,如果时间小于1秒,那么函数将在keyup上运行。问题是,如果我按住该键,浏览器会将其视为连续多次按下的键

有更好的方法吗


谢谢

也许你可以在按下键时触发一个计数器,然后收听下一个按键。只要计数器超过5秒,或者无论您认为需要多长时间,您都可以启动该功能。有意义吗?

连续的向下键不会触发向上键,因此可以区分它们

$('body').keydown(函数(){
如果(!$(this).data('timeDown')){//如果尚未按下,请节省时间
$(此).data('timeDown',+新日期);
}
}).keyup(函数(){
var diff=new Date-$(this).data('timeDown');//时差
如果(差值<1000){//小于1秒
警报(123);
}
$(this).data('timeDown',null);//重置时间
});

如果我了解到您的问题是浏览器将一把钥匙解读为多个按键事件。 你希望在按住一个键和简单按下时发生不同的事情;你希望这种差异建立在你认为应该构成“掌握”关键的某个时间的基础上。 因此,您需要通过跟踪keyup事件来区分按住和按下。以下伪代码将解决此问题:

按下键时:

if !yourBool 
    start timer

yourBool = true 
关于键控:

if timer < yourTime
    do something

yourBool = false
if timer
这将起作用,因为除非发生按键事件,否则计时器不会重新启动

现在。。。如果浏览器将按键保持解释为:
按键向下,按键向上,按键向下,按键向上……

然后,这种方法会出现问题。

浏览器会看到该键被按下多次,但
keydown
事件仅在第一次按下时发生


您想要的是从
keydown
事件开始计时,而不是
keydown

我刚刚编写了一个小脚本,用于区分按下的键和按下200毫秒的键。也许你可以利用它:

document.onkeydown = function(e){
    var keycode = window.event ? window.event.keyCode : e.which;
    if(keycode == 40){
        var timer = setTimeout(function(){
            alert('Down key held');
            document.onkeyup = function(){};
        }, 200); 
        document.onkeyup = function(){
            clearTimeout(timer);
            alert('Down key pressed');   
        }
    }
};

我也有类似的问题。我想捕获所有“第一个”按键按下事件,但如果连续事件是按键按下的结果,则忽略它们。不确定这是否是您想要的,但这里有一种方法:

var repeat = false;
el.addEventListener("keyup", function() { repeat = false; });
el.addEventListener("keydown", function() {
  if (!repeat) {
    // Run your code.
    repeat = true;
  }
});

有一个名为的键盘事件属性,如果按住该键,该属性将返回true

document.addEventListener('keydown', (event) => {
  if(event.repeat) {
    // key is being held down
  } else {
    // key is being pressed
  }
});

背景是什么?如果您在文本框中,在最后一次按键之前跟踪输入值是否有意义,然后检查下一次按键事件是否添加了多个字符?只是四处打探……您是否可以在触发第一个
keydown
事件时设置一个标志(例如布尔变量)(但如果已经设置),并在触发
keydup
时取消设置?
document.addEventListener('keydown', (event) => {
  if(event.repeat) {
    // key is being held down
  } else {
    // key is being pressed
  }
});