本文介绍如何通过监听键盘事件,让玩家直接使用物理键盘输入字母,彻底取代原有的虚拟字母弹窗界面,提升 crossword 游戏的交互流畅性与用户体验。
要在填字游戏中实现原生键盘输入(即用户点击格子后直接敲击字母键即可填入),核心思路是:移除对虚拟键盘(#kbtnlist)的依赖,转而监听全局 keydown 事件,并仅捕获有效的小写字母按键。
以下是推荐的实现方式:
// 在页面初始化时(例如 document.ready 或 initvkeyboard 之后)添加监听
document.addEventListener("keydown", function (e) {
// 仅处理单字符字母键(a–z),忽略 Shift、Ctrl、Backspace 等控制键
if (e.key.length === 1 && /^[a-z]$/.test(e.key)) {
typechar(e.key);
e.preventDefault(); // 阻止默认行为(如触发输入框聚焦或页面滚动)
}
});? 说明: e.key.length === 1 确保不是 Enter、Shift 等多字节键; /^[a-z]$/.test(e.key) 比 e.key >= "a" && e.key
确保你的 typechar(char) 函数能识别当前被选中的填字格子(即“活动单元格”)。典型做法是维护一个全局变量(如 currentCell)或通过 CSS 类(如 .active)标记当前焦点格:
function typechar(char) {
const activeCell = document.querySelector(".cell.active");
if (activeCell) {
activeCell.textContent = char.toUpperCase(); // 建议大写显示更符合填字习惯
// 可选:自动移动到下一个空格(如右/下方向)
moveToNextCell();
}
}
back,但可默认隐藏,仅在检测到触摸设备时启用。你无需修改 initvkeyboard() 来“模拟”键盘逻辑——它应被弃用或仅作为备用方案。只需在初始化阶段移除旧弹窗、绑定键盘监听即可:
function initGame() {
// 移除虚拟键盘(可选)
$("#kbtnlist").empty();
// 启用物理键盘输入
document.addEventListener("keydown", handleKeyboardInput);
// 设置初始焦点(确保键盘事件生效)
document.getElementById("crossword-grid").focus();
}
function handleKeyboardInput(e) {
if (e.key.length === 1 && /^[a-z]$/.test(e.key)) {
typechar(e.key);
e.preventDefault();
}
}这样,玩家点击某个格子后,即可直接敲击键盘字母完成输入,操作更自然、响应更迅速,真正实现专业级填字游戏体验。