Событие нажатия клавиши jQuery срабатывает многократно, когда клавиша удерживается, но не на всех клавишах

Это, вероятно, предполагаемое поведение или, по крайней мере, не проблема jQuery / js, но я хотел бы получить некоторые пояснения, если есть какие-либо

Возьмите следующее:

$(document).bind('keypress', function(e){
    switch(e.keyCode)
    {
        case 37:
            console.log('left cursor keydown, will fire on hold');
            break;
        case 39:
            console.log('right cursor keydown, will fire on hold');
            break;
        case 80:
            console.log('p will only fire once per press!');
            break;
    }
});

Вы также можете поиграть с примером в документации jQuery: http://api.jquery.com/keypress/

При нажатии курсора влево или вправо (или многие другие клавиши, такие как A, E, [, и т. д.), событие запускается, и вы получаете красивое сообщение журнала в консоли. Все в порядке, как и предполагалось. Однако теперь попробуйте удерживать клавишу - после короткой паузы вы увидите, что событие нажатия клавиши запускается несколько раз, когда вы удерживаете клавишу, однако, если вы попытаетесь нажать p (или, например, j ), он сработает только один раз.

Я тестирую это, используя FF 9.0.1 и mac OSX 10.7.1 и jQuery 1.7.1.

Это дизайн, это функция, зависящая от браузера, или это что делать с ОС или даже с самой клавиатурой? Также у кого-нибудь есть список клавиш, которые Будет ли повторяться, и ключи, которые не будут?

Что касается варианта использования, на самом деле его нет - это просто возникло, когда я привязывал анимацию к нажатию курсора и начал замечать странное поведение при нажатии клавиши .Мое обходное решение заключалось в использовании вместо этого события keyup () и preventDefault () в событии keydown () для ключей, которые меня интересовали, чтобы остановить курсоры прокручивают экран.

ОБНОВЛЕНИЕ: Похоже, что в событии нажатия клавиши keyCode всегда равен 0 для большинства букв, что может иметь какое-то отношение к тому, почему я думал, что обработчик запускается только один раз. После еще нескольких тестов я вижу повторяющиеся записи в журнале, как для курсоров. Если вы посмотрите страницу API jQuery и воспользуетесь ею в демонстрации, она покажет поведение, которое я описывал: http://api.jquery.com/keypress/

Я все еще не могу это объяснить: /

7
задан totallyNotLizards 1 February 2012 в 15:21
поделиться