Захват различных нажатий клавиш - PullRequest
1 голос
/ 27 августа 2009

Когда вы удерживаете нажатой клавишу, события JQuery начинают появляться как сумасшедшие для этого нажатия одной клавиши:

...
keydown
keypress
keyup
keydown
keypress
keyup
...

Есть ли какой-либо (даже не переносимый браузером) способ перехвата только одного события для каждой нажатой клавиши (пример: нажмите A и удерживайте ее нажатой, и это должно привести только к одному вызову функции)?

Ура!

Ответы [ 2 ]

5 голосов
/ 27 августа 2009

Я обнаружил, что keyup работает лучше всего ...

$(document).keyup(function(e) {
  alert(e.keyCode);
});
2 голосов
/ 27 августа 2009

Поскольку вы предоставляете jQuery обратный вызов, вы сдаетесь его остроумию. Однако вы могли бы увеличить задержку для чрезмерных уведомлений, установив какую-то очередь отложенных событий, которую вы обрабатываете каждую десятую секунды.

queue = new Array();
setTimeInterval( 100, function() { queue.process(); } );

queue.process = function( ) { 
    key = queue[0];
    process( key );

    // consume equivalent keypresses by shifting array
    var originallength = queue.length;

    // find shift size
    var firstdiff = 1;
    for(; firstdiff < queue.length && queue[ firstdiff ] == key; 
          firstdiff=firstdiff+1 ) 
    {}
    var newlength = originallength - firstdiff;

    // shift everything and delete trailing tail
    var i = firstdiff;        
    for( var j = 0; j != newlength; j=j+1 ) { queue[ j ] = queue[ j+firstdiff ]; }
    for( var k = newlength; k != originallength; k=k+1 ) { queue[k]=null; }
}

$(document).keyup( function(e) { queue[ queue.length ] = e; } );

Или вообще запретить добавление в очередь с использованием минимального различия во времени между событиями нажатия клавиш, как в этот ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...