当密钥被保持时,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; } }); 

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

当按下左或右光标(或许多其他键,如A,E,[,等)时,事件将触发,您将在控制台中收到一条漂亮的日志消息。 所有罚款和预期。 但是,现在尝试按住键 – 在短暂停顿后,您将看到当您按住键时keydown事件会多次触发,但是如果您尝试按下p (或者,例如, j ),它将只会触发一旦。

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

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

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

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

还是无法解释我自己:/

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

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

这个问题已存在多年,但我想我刚刚发现了一个问题。 这似乎工作正常

 $("#search_query").keyup(function(event) { //this will void fake keypresses if(event.charCode == 0 && event.keyCode == 0) { return false; } //place the rest of you code here }); 

此外 – 为了所有观看此post的人的利益:尝试“keydown”方法

Keypress会多次被解雇…… keydown不会

http://jquerymobile.com/demos/1.0a2/experiments/api-viewer/docs/keypress/index.html