如何在javascript中捕获双按键?

如何在javascript中捕获双按键?,javascript,keypress,Javascript,Keypress,我希望能够捕捉双按键(例如字符T),以便进行一些特殊处理。我希望按键足够快,不会像双击一样被解释为两个单独的按键。 有什么办法可以做到这一点吗?当按键被按下时,记下时间。然后将其与您记录的上一次击键的时间进行比较 如果差异在你的阈值之内,考虑它是双重的。否则,不要。粗略的例子: var delta = 500; var lastKeypressTime = 0; function KeyHandler(event) { if ( String.fromCharCode(event.char

我希望能够捕捉双按键(例如字符T),以便进行一些特殊处理。我希望按键足够快,不会像双击一样被解释为两个单独的按键。 有什么办法可以做到这一点吗?

当按键被按下时,记下时间。然后将其与您记录的上一次击键的时间进行比较

如果差异在你的阈值之内,考虑它是双重的。否则,不要。粗略的例子:

var delta = 500;
var lastKeypressTime = 0;
function KeyHandler(event)
{
   if ( String.fromCharCode(event.charCode).toUpperCase()) == 'T' )
   {
      var thisKeypressTime = new Date();
      if ( thisKeypressTime - lastKeypressTime <= delta )
      {
        doDoubleKeypress();
        // optional - if we'd rather not detect a triple-press
        // as a second double-press, reset the timestamp
        thisKeypressTime = 0;
      }
      lastKeypressTime = thisKeypressTime;
   }
}
var delta=500;
var lastKeypressTime=0;
函数KeyHandler(事件)
{
if(String.fromCharCode(event.charCode.toUpperCase())=='T')
{
var thisKeypressTime=新日期();
如果(thisKeypressTime-lastKeypressTime有一个变量(可能是
第一次按
)在按键事件发生时设置为true,并启动一个计时器,在设置的时间量(无论您希望他们按键的速度如何)后将该变量重置为false

在您的按键事件中,如果该变量为真,则您有一个双击

例如:

var first_press = false;
function key_press() {
    if(first_press) {
        // they have already clicked once, we have a double
        do_double_press();
        first_press = false;
    } else {
        // this is their first key press
        first_press = true;

        // if they don't click again in half a second, reset
        window.setTimeout(function() { first_press = false; }, 500);
    }
}

我知道现在回答这个问题已经太迟了,但我是如何实现的:

let pressed;
let lastPressed;
let isDoublePress;

const handleDoublePresss = key => {
    console.log(key.key, 'pressed two times');
}

const timeOut = () => setTimeout(() => isDoublePress = false, 500);

const keyPress = key => {
    pressed = key.keyCode;

    if (isDoublePress && pressed === lastPressed) {
        isDoublePress = false;
        handleDoublePresss(key);
    } else {
        isDoublePress = true;
        timeOut();
    }

    lastPressed = pressed;
}

window.onkeyup = key => keyPress(key);

你可以做“半秒”一个用户可以更改的可配置的持久值。可用性规则!我不是想给他提供一个临时解决方案。只是向他展示一般的想法。不管怎样,你会立即出现大量超时,这最终会让用户浏览器崩溃。Shog使用Date的答案肯定更好。@Josh Stodola:这可能可以通过将计时器ID保存在某个位置并在开始新的计时器ID之前停止它来避免。也就是说,这不仅仅是保留一个时间戳……我能想到的唯一用途是,如果您想对单次按下和双次按下执行两个不同的、互斥的操作:在计时器回调coul中进行检查d如果第一次按下的
仍然为真,则触发前者,如果按下的
仍然为假,则触发后者。此解决方案使用Ctrl键。他不说他需要那个键(尽管这对我来说很有意义)。@Josh Stodola:哈!显示了我读得多么仔细……看到了“Char T”,读到了“Ctrl T”OOPS!欢迎来到StAdvExcel。除了您提供的答案,请考虑提供一个简要解释为什么以及如何修复这个问题。