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

时间:2012-02-01 15:08:02

标签: 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;
    }
});

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

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

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

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

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

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

仍然无法解释自己:/

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

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