Как получить информацию о том, какая клавиша была нажата в течение какого времени? - PullRequest
8 голосов
/ 24 июня 2011

Итак, представьте себе этот код:

if (navigator.appName == "Opera")
    document.onkeypress = function (e) { console.log(e.keyCode); };
else 
    document.onkeydown = function (e) { console.log(e.keyCode); };

То, что это делает, довольно очевидно, я думаю. Проблема в том, что если вы удерживаете ключ в течение длительного периода времени, он будет зарегистрирован много раз. В моем приложении это проблема, потому что она заставляет мое приложение выполнять много ненужных вычислений. Можно ли как-то получить нажатие только один раз, но с информацией о том, как долго она удерживалась?

Спасибо.

Ответы [ 2 ]

12 голосов
/ 25 июня 2011

Вот, пожалуйста:

var pressed = {};

window.onkeydown = function(e) {
    if ( pressed[e.which] ) return;
    pressed[e.which] = e.timeStamp;
};

window.onkeyup = function(e) {
    if ( !pressed[e.which] ) return;
    var duration = ( e.timeStamp - pressed[e.which] ) / 1000;
    // Key "e.which" was pressed for "duration" seconds
    pressed[e.which] = 0;
};

Живая демоверсия: http://jsfiddle.net/EeXVX/1/show/

(удалите часть URL "show /", чтобы просмотреть код для демонстрации)

Итак, у вас есть объект pressed, который отслеживает, какие клавиши нажимаются в данный момент и в какой момент (во времени) они были нажаты.

Внутри обработчика keyup вы определяете, была ли нажата клавиша, и, если это так, вычисляете продолжительность, вычитая метки времени событий keyup / keydown.

2 голосов
/ 24 июня 2011

Вы пытались сделать что-то подобное,

  1. onkeydown, удалите слушателя keydown.
  2. onkeyup, снова подключить слушателя keydown и время компьютера?
...