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

event.keyCode报错:无法读取属性'keyCode',求按I键加载画布界面方案

解决 "Cannot read property 'keyCode'" 错误并实现I键加载界面

首先来说你遇到的报错原因:你在代码开头直接调用了loadScreen(),这时候并没有传入event对象,所以函数里的event是undefined,尝试访问它的keyCode属性自然就会抛出错误啦。

接下来给你两个关键的修复点,同时优化代码符合现代标准:

1. 处理初始调用的无参数情况

把初始调用的loadScreen()改成只执行默认初始化逻辑,或者调整函数,让它在没有event的时候不执行按键判断逻辑。比如:

function loadScreen(event) {
  // 如果是初始调用(没有event),直接执行基础绘制
  if (!event) {
    // 这里写初始界面的绘制代码
    draw.fillStyle = "#000";
    draw.fillRect(0, 0, canvas.width, canvas.height);
    return;
  }
  
  // 按键判断逻辑
  // 推荐用event.key替代已废弃的keyCode,更直观
  const key = event.key.toLowerCase(); // 不区分大小写
  if (key === 'i') {
    InventoryScreen();
  }
}

2. 替换已废弃的keyCode

keyCode已经被标准废弃了,现在更推荐使用event.key(直接获取按键字符)或者event.code(获取按键的物理位置)。比如判断按下I键,用event.key === 'I'或者转成小写不区分大小写,这样代码可读性更高。

完整修复后的代码

var canvas = document.querySelector("canvas");
canvas.width = 640;
canvas.height = 640;
var draw = canvas.getContext("2d");

// 绑定键盘事件
document.addEventListener('keydown', loadScreen);

// 初始加载界面
loadScreen();

function loadScreen(event) {
  // 初始调用无event,绘制默认界面
  if (!event) {
    draw.fillStyle = "#222";
    draw.fillRect(0, 0, canvas.width, canvas.height);
    draw.fillStyle = "#fff";
    draw.font = "20px Arial";
    draw.fillText("按下I键打开背包界面", 20, 30);
    return;
  }

  // 判断是否按下I键(不区分大小写)
  if (event.key.toLowerCase() === 'i') {
    InventoryScreen();
  }
}

function InventoryScreen() {
  // 清空画布
  draw.fillStyle = "#111";
  draw.fillRect(0, 0, canvas.width, canvas.height);
  
  // 绘制背包界面内容,示例:
  draw.fillStyle = "#4CAF50";
  draw.fillRect(50, 50, 540, 540);
  draw.fillStyle = "#fff";
  draw.font = "24px Arial";
  draw.fillText("背包界面", 280, 80);
}

这样修改后,既解决了初始调用的报错问题,又用更现代的方式实现了按键触发逻辑,同时初始加载也能正常显示默认界面。

内容的提问来源于stack exchange,提问作者Riley.Oram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:21:38