2009-08-27 12 views
1

あなたがキーを押したままにすると、jQueryのイベントは、このキーを1回押すだけのために狂ったように飛び出し始める:キャプチャの異なるキー押下

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

をキャプチャする任意の(たとえ非ブラウザポータブル)方法はありますを押すたびに1つのイベントしか表示されません(例:Aを押したままにしておくと、関数呼び出しは1つだけになります)。

乾杯!あなたはjQueryのにコールバックを与えているので

+1

はい:これらのイベントのいずれかにのみバインドします。 –

答えて

5

私はkeyUpイベントが最適に動作することを発見した...

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

しかし、それは単一のキーを押すごとに複数のイベントを生成します。 –

+0

@Mike:イベントにバインドしてもイベントは生成されません。 –

+0

あなたは$(document).bind( 'keydown'、コールバック)を意味しますか?します。 –

2

、あなたはそれの知恵に降伏しています。しかし、10分の1秒ごとに処理する何らかの種類の遅延イベントキューをインストールすることで、過剰な通知に対してより多くの遅延を導入することができます。

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のように、キー押下イベント間の最小時間の差分を使用してalltogetherキューに追加防ぎます。

関連する問題