2009-08-27 5 views
1

는, JQuery와 이벤트는이 하나의 키 누름을 위해 미친 듯이 튀어 시작 : 캡처 별개의 키 누름

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

을 캡처 할 수있는 (심지어 비 브라우저 휴대용) 방법이 각 키에 대해 하나의 이벤트 만 (예 : A 키를 누른 채로 있으면 하나의 함수 호출 만 생성됩니다)?

건배! 당신이 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 같이 키 누르기 이벤트 사이의 최소 시간은 diff를 사용 alltogether 큐에 추가 방지합니다.