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
2009-08-03 18:08:04
This solution uses the Ctrl key. He does not say he needs that (although it makes sense to me).
Josh Stodola
2009-08-03 18:36:34
**@Josh Stodola:** HA! Shows how careful i read... Saw "Char T", read "Ctrl T"... oops!
Shog9
2009-08-03 18:42:17
working great thanks!
zaladane
2009-08-03 18:45:40
+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
2009-08-03 18:08:14
AND you can make "half-a-second" a configurable persistent value which users can change. Usability rules!
dalbaeb
2009-08-03 18:32:19
I wasn't trying to provide a drop-in solution for him. Just showing him the general idea.
Brian Ramsay
2009-08-03 18:34:18
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
2009-08-03 18:39:15
**@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
2009-08-03 18:52:06