代码之家  ›  专栏  ›  技术社区  ›  pex

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

  •  4
  • pex  · 技术社区  · 15 年前

    div S我想通过按箭头键(38和40)跳过它们。

    Mac OS和Linux上的Firefox3不会在按住键时重复这些事件。显然只有 keypress 支持事件重复。因为键38和40仅在上受支持 keydown 我有点困了。

    2 回复  |  直到 15 年前
        1
  •  0
  •   user231401 user231401    15 年前

    您可以使用keypress并检查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. 字符事件返回的值)

        2
  •  1
  •   Tim Down    15 年前

    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;
    };