当你按住一个键时,JQuery 事件开始像这个单一的按键一样疯狂地弹出:
...
keydown
keypress
keyup
keydown
keypress
keyup
...
是否有任何(甚至非浏览器便携)方法可以为每个按下的键捕获一个事件(例如:按下 A 并按住它,这应该只产生一个函数调用)?
干杯!
当你按住一个键时,JQuery 事件开始像这个单一的按键一样疯狂地弹出:
...
keydown
keypress
keyup
keydown
keypress
keyup
...
是否有任何(甚至非浏览器便携)方法可以为每个按下的键捕获一个事件(例如:按下 A 并按住它,这应该只产生一个函数调用)?
干杯!
我发现 keyup 效果最好...
$(document).keyup(function(e) {
alert(e.keyCode);
});
既然你给 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; } );
或者使用按键事件之间的最小时间差异来防止附加到队列中,如this answer中所示。