【问题标题】:jQuery keypress event fires repeatedly when key is held - but not on all keysjQuery keypress 事件在按住键时重复触发 - 但不是在所有键上
【发布时间】: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


【解决方案1】:

行为因浏览器和操作系统而异。以下页面在第 2.2 节中详细介绍了自动重复键事件的主题:

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

【讨论】:

    【解决方案2】:

    这个问题已经存在很久了,但我想我刚刚发现了一个解决方法。 这似乎工作正常

    $("#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
    });
    

    【讨论】:

      【解决方案3】:

      另外 - 为了所有查看此帖子的人的利益:尝试“keydown”方法

      Keypress 将被触发多次... keydown 不会

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

      【讨论】:

      • Keydown 实际上会重复(至少在最新的 Google Chrome 中)。在这里尝试:$(document).on('keydown', function(ev) { console.log(ev) })
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多