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

如何在不依赖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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:24:00