捕获不同的按键

时间:2009-08-27 18:45:59

标签: javascript jquery keypress

当您按住某个键时,JQuery事件开始像疯狂一样弹出这个单键按键:

...
keydown
keypress
keyup
keydown
keypress
keyup
...

是否有任何(甚至是非浏览器可移植的)方式来捕获每个按下的键只有一个事件(例如:按A并按住它,这应该只产生一个函数调用) ?

干杯!

2 个答案:

答案 0 :(得分:5)

我发现keyup效果最好......

$(document).keyup(function(e) {
  alert(e.keyCode);
});

答案 1 :(得分:2)

既然你给jQuery一个回调,你就会放弃它的智慧。但是,您可以通过安装某种每十分之一秒处理一次的惰性事件队列来为过多的通知引入更多延迟。

queue = new Array();
setTimeInterval( 100, function() { queue.process(); } );

queue.process = function( ) { 
    key = queue[0];
    process( key );

    // consume equivalent keypresses by shifting array
    var originallength = queue.length;

    // find shift size
    var firstdiff = 1;
    for(; firstdiff < queue.length && queue[ firstdiff ] == key; 
          firstdiff=firstdiff+1 ) 
    {}
    var newlength = originallength - firstdiff;

    // shift everything and delete trailing tail
    var i = firstdiff;        
    for( var j = 0; j != newlength; j=j+1 ) { queue[ j ] = queue[ j+firstdiff ]; }
    for( var k = newlength; k != originallength; k=k+1 ) { queue[k]=null; }
}

$(document).keyup( function(e) { queue[ queue.length ] = e; } );

或者使用keypress事件之间的最小时差来防止全部追加到队列,如this answer