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

开发数独游戏:如何在keydown事件中获取未被修饰键修改的原始按键值?

解决keydown事件中获取不受修饰键影响的原始按键值问题

你可以通过以下两种可靠方案实现需求,无需依赖兼容性差的Keyboard.getLayoutMap():

方案一:使用KeyboardEvent.code(推荐)

KeyboardEvent.code会返回按键的物理键位标识,数字键的标识固定为Digit0到Digit9——无论是否按下shift或其他修饰键,这个标识都不会改变。直接提取标识中的数字即可获取原始按键值。

示例代码:

document.addEventListener('keydown', (e) => {
  // 匹配数字键的code格式
  const digitMatch = e.code.match(/Digit(\d)/);
  if (digitMatch) {
    const originalDigit = digitMatch[1];
    if (e.shiftKey) {
      // 执行shift+数字的逻辑:关闭对应候选数
      console.log(`关闭单元格的“${originalDigit}”候选数`);
    } else {
      // 执行普通数字键逻辑:切换候选数状态
      console.log(`切换单元格的“${originalDigit}”候选数状态`);
    }
    e.preventDefault(); // 阻止默认输入行为,避免输出!/*等符号
  }
});

该方案兼容性极佳,主流浏览器(Chrome、Edge、Firefox 52+、Safari 10.1+)均支持,完全满足数独游戏的用户群体需求。

方案二:使用KeyboardEvent.keyCode(兼容旧浏览器)

虽然keyCode已被标记为废弃,但目前所有浏览器仍支持它。数字键的keyCode固定为48(对应0)到57(对应9),不受修饰键影响。

示例代码:

document.addEventListener('keydown', (e) => {
  // 判断是否为数字键
  if (e.keyCode >= 48 && e.keyCode <= 57) {
    const originalDigit = String.fromCharCode(e.keyCode);
    if (e.shiftKey) {
      console.log(`关闭单元格的“${originalDigit}”候选数`);
    } else {
      console.log(`切换单元格的“${originalDigit}”候选数状态`);
    }
    e.preventDefault();
  }
});

如果需要兼容IE等极旧浏览器,可以选择此方案,但优先推荐方案一。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:32:52