You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS按键控制问题:逻辑或判断中第二个按键值未被识别如何解决

问题产生原因
  • 逻辑或运算符使用语法错误:(87 || 38)在JavaScript中会优先执行括号内的运算,由于87属于真值(非0数字),该表达式最终只会返回87,你写的判断条件本质上只校验了W键的keyCode,上方向键对应的38完全没有生效。
  • 仅为上移逻辑添加了方向键的判断逻辑,剩余下移、左移、右移的判断都只匹配了WASD对应的字符,没有添加方向键的校验规则。
  • 代码中事件回调的参数定义为e,但实际使用的是浏览器非标准全局event对象,存在兼容性隐患。
修复方案

你需要将多按键的判断拆分为独立的相等校验,同时为所有移动逻辑同步添加方向键的判断规则,统一使用标准事件参数e获取按键信息,修复后的完整代码如下:

document.addEventListener("keydown", (e) => {
    const rocket = document.querySelector(".rocket");
    const speed = 10;

    // 上移:W键 / 上方向键
    if ((e.keyCode === 87 || e.keyCode === 38) && rocket.offsetTop > 100) {
        rocket.style.top = `${rocket.offsetTop - speed}px`;
    }
    // 下移:S键 / 下方向键
    if ((e.keyCode === 83 || e.keyCode === 40) && rocket.offsetTop < window.innerHeight - 300) {
        rocket.style.top = `${rocket.offsetTop + speed}px`;
    }
    // 左移:A键 / 左方向键
    if ((e.keyCode === 65 || e.keyCode === 37) && rocket.offsetLeft > 50) {
        rocket.style.left = `${rocket.offsetLeft - speed}px`;
    }
    // 右移:D键 / 右方向键
    if ((e.keyCode === 68 || e.keyCode === 39) && rocket.offsetLeft < window.innerWidth - 125) {
        rocket.style.left = `${rocket.offsetLeft + speed}px`;
    }
    // 空格跳跃
    if (e.keyCode === 32 && rocket.offsetTop > 100) {
        rocket.style.top = `${rocket.offsetTop - 200}px`;
    }
    console.log(e.keyCode);
});

优化建议:keyCode属性已被Web标准废弃,你可以改用可读性更强的key属性做判断,例如上移逻辑可以写为if ((e.key === 'w' || e.key === 'ArrowUp') && rocket.offsetTop > 100),无需记忆对应数字编码。

内容的提问来源于stack exchange,提问作者mcg1nley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:30:01