当按住箭头键时,如何在Firefox中获得自动重复的keydown事件?

时间:2009-12-14 10:30:31

标签: javascript firefox javascript-events arrow-keys

我有几个可编辑的div。我想按箭头键(38和40)跳过它们。

Mac OS和Linux上的Firefox 3不会重复持有密钥的事件。显然,重复只支持keypress个事件。由于键38和40仅在keydown上得到支持,我有点卡住了。

2 个答案:

答案 0 :(得分: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;
};

答案 1 :(得分:0)

您可以使用按键并检查e.keyCode == 38,40而不是e.which或e.charCode 这在Mac和Win中是一致的。

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

参见JavaScript Madness: Keyboard Events(3.2。在字符事件上返回的值) 和MDC上的event.keyCode。