首页 文章

当keyup事件(对于另一个键)被触发时,keydown(重复)会中断

提问于
浏览
1

这有点奇怪,所以我想我要么缺少一些明显的东西,要么就是这些事件在浏览器中实现的缺陷 .

让我首先总结一个示例场景,在提供一个孤立的案例之前,这个问题就出现了;

箭头键用于移动播放器(因为只要在页面的任何位置按键,就会触发handleKeyDown函数) . 同样,只要释放一个键,就会触发另一个函数(handleKeyUp) .

当你(玩家)按住左键时,handleKeyDown函数会被重复触发(我认为我认为这会违背你的期望和名称所暗示的内容,但是,尽管如此,这是所有浏览器的正常行为,因为我确定你懂) .

所以这就是发生的事情:玩家有朝这个方向行走的方向;然后他们按下一个数字键(对于热键项目),他们继续走路,同时按住方向 . 这里发生的是当您释放热键项目的数字键时,玩家移动的重复就会停止!

我写了一个非常小的这种行为的例子:

<html>
<head>
    <script type='text/javascript' src='jquery-1.5.1.min.js'></script>
    <script type='text/javascript'>
        var log = {};
        var keyState = {};
        var keyCount = {'down': 0, 'up': 0};
        window.addEventListener('keydown', handleKeyDown, false);
        window.addEventListener('keyup', handleKeyUp, false);
        function handleKeyDown (e)
            {
            keyState[e.keyCode] = true;
            keyCount.down++;
            log.prepend(" ["+e.keyCode+"] ");
            return false;
            }
        function handleKeyUp (e)
            {
            keyState[e.keyCode] = false;
            keyCount.down++;
            return true;
            }
        $(function(){log = $('#log');});
    </script>
</head>
<body>
    <div id='debug'></div>
    <div id='log'></div>
</body>

你也可以在这里试试:

http://sikosoft.net/keys.html

按页面上的任意键,您将看到页面上出现keyCode . 按住键时,键码会一遍又一遍地重复 .

当初始键仍然被按住时,按下另一个键时,该行为变得古怪 . 在释放该最近的密钥时,重复从第一个密钥停止 . 有趣的是,如果您尝试该示例并按住一个键,然后按住第二个键,但不是释放第二个键,而是释放第一个键:第二个键继续重复 .

所以似乎继续发生的是,当keyup事件被触发时,它似乎终止了在早期键上触发的keydown事件中的重复 .

我've tried all sorts of things ranging from using returning false in both event-handling functions, returning true, trying keypress instead of keydown, saving key-states and continuing movement if the button'的keystate仍然是真的,但是归结为是当keyup被触发时,任何主动传播的keydown事件都会被杀死 . 我已阅读JavaScript Madness: Keyboard Events,我没有看到任何关于这种特定行为的内容 .

这是关键事件实施的设计缺陷,还是我遗漏了什么?我在Chrome,IE和Firefox中观察到了同样的行为 .

有什么建议或意见吗?

1 回答

  • 5

    这就是操作系统/环境的工作方式,因此浏览器的工作方式也是如此 .

    keydown重复不应该在其他任何地方表现出来 . 打开记事本,或vim,或pico,或您使用的任何文本编辑器,并执行相同的事件序列 . 您会看到在键盘后,您按下的第一个键不会继续打印新的字母 . 那就是他们通过编辑和浏览器等传播的方式 .

相关问题