Как получить автоматически повторяющиеся события нажатия клавиш в Firefox, когда клавиши со стрелками удерживаются? - PullRequest
4 голосов
/ 14 декабря 2009

У меня есть несколько редактируемых div с. Я хочу прыгать через них, нажимая клавиши со стрелками (38 и 40).

Firefox 3 в Mac OS и Linux не будет повторять события, связанные с удержанием клавиши. Очевидно, что только keypress события поддерживаются для повторения. Так как ключи 38 и 40 поддерживаются только на keydown Я застрял.

Ответы [ 2 ]

1 голос
/ 14 декабря 2009

Да, вы застряли. Вы можете эмулировать желаемое поведение, используя таймеры, пока не получите соответствующий keyup, но это, очевидно, не будет использовать настройки повторения клавиатуры компьютера пользователя.

В следующем коде используется вышеуказанный метод. Код, который вы хотите обрабатывать событиями нажатия клавиш (как реальными, так и смоделированными), должен быть в 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;
};
0 голосов
/ 14 декабря 2009

Вы можете использовать нажатие клавиши и проверить 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: события клавиатуры (3.2. Значения, возвращаемые в событиях символов) и event.keyCode на MDC.

...