views:

643

answers:

2

I would like to be able to trap the double key press (for the Char T for example) in order to do some special processing.I would like the key presses to happen fast enough to not be interpreted as two separate presses, just like the double click. Any ideas how i can achieve this?

+6  A: 

When the key(s) are hit, make a note of the time. Then compare it with the time you noted the last time they key(s) were hit.

If the difference is within your threshold, consider it a double. Otherwise, don't. Rough example:

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;
   }
}
Shog9
This solution uses the Ctrl key. He does not say he needs that (although it makes sense to me).
Josh Stodola
**@Josh Stodola:** HA! Shows how careful i read... Saw "Char T", read "Ctrl T"... oops!
Shog9
working great thanks!
zaladane
+5  A: 

Have a variable (perhaps first_press) that you set to true when a keypress event happens, and start a timer that will reset the variable to false after a set amount of time (however fast you want them to press the keys).

In your keypress event, if that variable is true then you have a double press.

Example:

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);
    }
}
Brian Ramsay
AND you can make "half-a-second" a configurable persistent value which users can change. Usability rules!
dalbaeb
-1 This works for *every* key pressed.
Josh Stodola
I wasn't trying to provide a drop-in solution for him. Just showing him the general idea.
Brian Ramsay
Regardless, you're going to have tons of timeouts going at once, which will eventually bring the users browser to its knees. Shog's answer using Date is definitely better.
Josh Stodola
**@Josh Stodola:** that could probably be avoided by saving the timer ID somewhere and stopping it prior to starting a new one. That said, it's more work than just keeping a timestamp... The only use i can think of for it would be if you wanted to perform two different, mutually-exclusive actions for single-press and double-press: a check in the timer callback could trigger the former if `first_press` was still true, and the latter if it was false.
Shog9