2009-12-14 4 views
4

수정 가능한 div 개가 있습니다. 나는 화살 열쇠 (38와 40)를 눌러서 그들을 뛰어 넘고 싶다.화살표 키를 누르고있을 때 Firefox에서 자동 반복 keydown 이벤트를 얻으려면 어떻게해야합니까?

Mac OS 및 Linux의 Firefox 3는 키 보관시 이벤트를 반복하지 않습니다. 분명히 반복만을 위해 keypress 이벤트 만 지원됩니다. 키 38 및 40은 keydown에서만 지원되므로 다소 고생했습니다.

답변

0
당신의 키를 사용하는 대신 e.which 또는 e.charCode의 == (38, 40)를 e.keyCode을 확인할 수 있습니다

이것은 Mac과 Win에서 일관됩니다.

$('#test').bind($.browser.mozilla ? 'keypress' : 'keyup', function(e) { 
    if ((e.which || e.keyCode) == 40) { /* doSometing() */ } 
}); 

JavaScript Madness: Keyboard Events (3.2. 문자 이벤트에 반환 된 값) 및 event.keyCode MDC에를 참조하십시오.

+0

동일한 페이지 (사람을 참조하는 내 스톡 이벤트 페이지이기도 함)에는 "2.2. 자동 트리거시 트리거되는 이벤트"가 있습니다. 이는 특수 키의 'keypress' 이벤트 자동 반복을 지원하는 브라우저를 제안합니다 커서 키와 같은 것은'keydown' 이벤트보다 낫지 않습니다. –

+0

'키 업'대신 firefox (내 경우에는 사파리)를 제외한 모든 브라우저에서 'keydown'이 제대로 작동했습니다. 감사! – pex

+0

'$. browser '는 이제 가치가 떨어졌습니다. – Cullub

1

예, 그렇습니다. 해당 keyup을받을 때까지 타이머를 사용하여 원하는 동작을 에뮬레이트 할 수 있지만이 작업은 사용자의 컴퓨터 키보드 반복 설정을 사용하지 않습니다.

다음 코드는 위의 방법을 사용합니다. 이 코드는 (실제 및 모의 모두) 이벤트를 keyDown 처리하는 경우는 handleKeyDown에 가야한다 :

var keyDownTimers = {}; 
var keyIsDown = {}; 
var firstKeyRepeatDelay = 1000; 
var keyRepeatInterval = 100; 

function handleKeyDown(keyCode) { 
    if (keyCode == 38) { 
     alert("Up"); 
    } 
} 

function simpleKeyDown(evt) { 
    evt = evt || window.event; 
    var keyCode = evt.keyCode; 
    handleKeyDown(keyCode); 
} 

document.onkeydown = function(evt) { 
    var timer, fireKeyDown; 
    evt = evt || window.event; 
    var keyCode = evt.keyCode; 

    if (keyIsDown[keyCode]) { 
     // Key is already down, so repeating key events are supported by the browser 
     timer = keyDownTimers[keyCode]; 
     if (timer) { 
      window.clearTimeout(timer); 
     } 

     keyIsDown[keyCode] = true; 
     handleKeyDown(keyCode); 

     // No need for the complicated stuff, so remove it 
     document.onkeydown = simpleKeyDown; 
     document.onkeyup = null; 
    } else { 
     // Key is not down, so set up timer 
     fireKeyDown = function() { 
      // Set up next keydown timer 
      keyDownTimers[keyCode] = window.setTimeout(fireKeyDown, keyRepeatInterval); 
      handleKeyDown(keyCode); 
     }; 

     keyDownTimers[keyCode] = window.setTimeout(fireKeyDown, firstKeyRepeatDelay); 
     keyIsDown[keyCode] = true; 
    } 
}; 

document.onkeyup = function(evt) { 
    evt = evt || window.event; 
    var keyCode = evt.keyCode; 
    var timer = keyDownTimers[keyCode]; 
    if (timer) { 
     window.clearTimeout(timer); 
    } 
    keyIsDown[keyCode] = false; 
}; 
관련 문제