【问题标题】:What (if any) is the precedence of javascript keydown events?javascript keydown 事件的优先级是什么(如果有)?
【发布时间】:2013-05-24 03:11:54
【问题描述】:

我正在尝试创建一个简单的 javascript 程序来读取 keydown 事件并将它们转换为 HTML 画布上的运动。到目前为止,我已经取得了相当大的成功,我在(我假设是)箭头键优先级方面遇到了一个奇怪的问题。发生的情况是,如果我按住右箭头,然后按下左箭头,那么左箭头就会接管。如果我按住左箭头并按下右箭头,则没有任何变化(我移动的块继续向左移动)。我已经切换了读取按键的顺序,但没有成功。

我用于读取 keydowns 和 keyups 的代码是这样的:

//Listener for when keys are pressed
window.addEventListener('keydown', function (event) {
    keyCodes[event.keyCode] = true;
});

//Listener for keys being released
document.addEventListener('keyup', function (event) {
    keyCodes[event.keyCode] = false;
});

然后在这里解释

//movement function
function move () {
    if (keyCodes[right]) {
        velX = 12.0;
    }
    if (keyCodes[left]) {
        velX = -12.0;
    }
};

function update() {
    if (keyCodes[right] || keyCodes[left])
        move();

    posX += velX;

    if (!keyCodes[right] && velX > 0)
        velX -= gravity;
    if (!keyCodes[left] && velX < 0)
        velX += gravity;
};

任何人都可以看到,或者是否有人已经知道,为什么左键优先于右键?

已解决:

修正的移动函数如下:

function move () {
    if (keyCodes[left] && velX > -12.0) {
        velX -= 2.0;
    }
    if (keyCodes[right] && velX < 12.0) {
        velX += 2.0;
    }
};

【问题讨论】:

  • 您是说同时按下两个键?跨浏览器的行为是否相同?作为测试,我建议您颠倒move()update()if 语句的顺序(首先测试keyCodes[left] 值)。看看这是否会改变行为。如果是这样,则问题出在您处理事件的逻辑上。如果不是,那可能是 JS 处理多次按下时存在某种歧义(可能是特定于浏览器的)。
  • 是的,同时按下两个键。我已经尝试过跨浏览器,并且得到了相同的结果,并且更改了处理顺序并没有帮助。
  • 更正:重新排序它们导致相反的情况发生。我之前重新订购时一定错过了这一点。感谢您的帮助!

标签: javascript events keydown operator-precedence


【解决方案1】:

在您的函数中,您首先检查是否按下了右键,然后检查是否按下了左键。如果右键没有被按下,你应该只检查左键

    ...

    if (keyCodes[right]) {
        velX = 12.0;
    }
    // note the "else" before the "if"
    else if (keyCodes[left]) {
        velX = -12.0;
    }

    ...

    if (!keyCodes[right] && velX > 0)
        velX -= gravity;
    // again note the "else"
    else if (!keyCodes[left] && velX < 0)
        velX += gravity;

    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多