【发布时间】:2012-02-01 15:08:02
【问题描述】:
这可能是预期的行为,或者至少不是 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 进行测试。
这是设计使然,是依赖于浏览器的功能,还是与操作系统甚至键盘本身有关?还有没有人列出会重复的键和不会重复的键?
就用例而言,实际上并没有——这只是在我将动画绑定到光标按下时突然出现的,并且在按下键时开始看到奇怪的行为。我的解决方法是改用keyup() 事件,并在keydown() 事件上为我感兴趣的键使用preventDefault(),以停止光标滚动屏幕。
更新:
似乎在 keypress 事件中,对于大多数字母,keyCode 始终为0,这可能与我认为处理程序只触发一次的原因有关。经过更多测试后,我看到了重复的日志条目,例如游标。如果您检查 jQuery API 页面,并在上面使用演示,它会表现出我所描述的行为:http://api.jquery.com/keypress/
我自己还是无法解释:/
【问题讨论】:
-
所有键重复。您需要在每个 switch case 的末尾添加
break,除非您故意将它们排除在外。要么你的键盘出现故障,要么你的代码只需要一些break's。 -
不适合我——“p”重复得很好。我认为这是您键盘硬件/固件的功能。
-
@BrianGraham 刚刚发现了这一点,谢谢 :) 在 jsfiddle 上再次测试后,我也看到所有键都重复了 - 但是对于 keypress 事件,大多数键的 keyCode attr 为 0,这将解释我看到的一些奇怪的行为
标签: javascript jquery keypress