수정 가능한 div
개가 있습니다. 나는 화살 열쇠 (38와 40)를 눌러서 그들을 뛰어 넘고 싶다.화살표 키를 누르고있을 때 Firefox에서 자동 반복 keydown 이벤트를 얻으려면 어떻게해야합니까?
Mac OS 및 Linux의 Firefox 3는 키 보관시 이벤트를 반복하지 않습니다. 분명히 반복만을 위해 keypress
이벤트 만 지원됩니다. 키 38 및 40은 keydown
에서만 지원되므로 다소 고생했습니다.
수정 가능한 div
개가 있습니다. 나는 화살 열쇠 (38와 40)를 눌러서 그들을 뛰어 넘고 싶다.화살표 키를 누르고있을 때 Firefox에서 자동 반복 keydown 이벤트를 얻으려면 어떻게해야합니까?
Mac OS 및 Linux의 Firefox 3는 키 보관시 이벤트를 반복하지 않습니다. 분명히 반복만을 위해 keypress
이벤트 만 지원됩니다. 키 38 및 40은 keydown
에서만 지원되므로 다소 고생했습니다.
이것은 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에를 참조하십시오.
예, 그렇습니다. 해당 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;
};
동일한 페이지 (사람을 참조하는 내 스톡 이벤트 페이지이기도 함)에는 "2.2. 자동 트리거시 트리거되는 이벤트"가 있습니다. 이는 특수 키의 'keypress' 이벤트 자동 반복을 지원하는 브라우저를 제안합니다 커서 키와 같은 것은'keydown' 이벤트보다 낫지 않습니다. –
'키 업'대신 firefox (내 경우에는 사파리)를 제외한 모든 브라우저에서 'keydown'이 제대로 작동했습니다. 감사! – pex
'$. browser '는 이제 가치가 떨어졌습니다. – Cullub