如何在不依赖HTML的纯JavaScript环境中获取键盘输入
纯JavaScript非浏览器环境获取键盘输入方案
报错原因说明
你使用的document.addEventListener是浏览器专属的DOM API,仅在带浏览器上下文的运行环境中存在。Node.js、Deno这类无浏览器宿主的纯JS运行环境没有内置document对象,因此会抛出document is not defined的报错。
可落地实现方案
JS语言本身的标准中没有定义键盘输入相关的接口,键盘输入能力由运行时宿主提供,不同的纯JS运行环境对应不同的实现方案:
1. Node.js 环境实现(无需第三方依赖)
通过Node.js内置的readline和process.stdin模块实现,无需依赖任何HTML/DOM能力:
const readline = require('readline'); // 绑定按键事件到标准输入流 readline.emitKeypressEvents(process.stdin); // 开启原始模式,无需等待回车即可捕获按键输入 if (process.stdin.isTTY) { process.stdin.setRawMode(true); } process.stdin.on('keypress', (_, key) => { // 支持Ctrl+C退出程序 if (key.ctrl && key.name === 'c') { process.exit(); } // 自定义按键判断逻辑 console.log('按下的按键名称:', key.name); if (key.name === 'left') { console.log('Left was pressed'); } else if (key.name === 'right') { console.log('Right was pressed'); } });
直接在Node.js环境运行上述代码即可监听键盘输入。
2. Deno 环境实现
如果使用Deno作为运行时,可以通过Deno.stdin接口实现:
const decoder = new TextDecoder(); for await (const buffer of Deno.stdin.readable) { const input = decoder.decode(buffer); // 支持Ctrl+C退出 if (input === '\x03') { Deno.exit(); } // 方向键判断逻辑 if (input === '\x1B[D') { console.log('Left was pressed'); } else if (input === '\x1B[C') { console.log('Right was pressed'); } }
运行时需要添加--unstable权限参数。
注意事项
- 目前没有兼容所有运行环境的通用纯JS键盘输入实现,需要根据你实际使用的JS运行时选择对应方案
- 你之前找到的需要HTML相关能力的教程,均是针对浏览器运行环境的实现,不适用于非浏览器的纯JS场景
内容的提问来源于stack exchange,提问作者Kaytitulaer2008
相关产品推荐
相关产品推荐

