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
相关产品推荐
相关产品推荐

