当key持有时,jQuery keypress事件会反复触发 - 但不会在所有键上触发

tot*_*rds 7 javascript jquery keypress

这可能是预期的行为或至少不是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;
    }
});
Run Code Online (Sandbox Code Playgroud)

你也可以在jQuery的文档中使用这个例子:http://api.jquery.com/keypress/

当按下左或右光标(或许多其他键,如A,E,[,等)时,事件将触发,您将在控制台中收到一条漂亮的日志消息.所有罚款和预期.不过,现在抱着试试看的关键下来-在经过短暂的停顿,你会看到,当你按住键keydown事件触发多次,但是如果你试图打一个p(或者,例如,一个j),它只会触发一次.

我正在使用FF 9.0.1和mac OSX 10.7.1以及jQuery 1.7.1对此进行测试.

这是设计,是依赖于浏览器的功能,还是与操作系统,甚至键盘本身有关?还有人有一个会重复的键列表和不会的键吗?

就用例而言,实际上没有一个 - 当我将动画绑定到光标按下并且在按下按键时开始看到奇怪的行为时,这只会出现.我的解决方法是改为使用keyup()事件,并preventDefault()keydown()事件中使用我感兴趣的键,以阻止游标滚动屏幕.

更新:似乎在keypress事件中,keyCode始终0用于大多数字母,这可能与我认为处理程序只触发一次的原因有关.经过一些测试后,我看到了游标的重复日志条目.如果你检查jQuery API页面,并使用它上面的演示,它展示了我描述的行为:http://api.jquery.com/keypress/

还是无法解释自己:/

Tim*_*own 5

浏览器和操作系统之间的行为不同.以下页面详细介绍了2.2节中自动重复键事件的主题:

http://unixpapa.com/js/key.html