如何使用节点和 JavaScript 在按 Enter 之前从终端读取用户输入?
我制作了一个简单的 javascript 应用程序,它使用 process.stdin 或 readline 来获取用户输入,但我不希望用户必须使用 Enter/Return 提交输入。 我想读取按键/按键上的用户输入。 这可能吗? 我怎样才能做到这一点? 谢谢!
要求:
更喜欢:
iohook
包。
Node.JS 的原生方式是这样的。
require("readline").emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);
process.stdin.on("keypress", (char, evt) => {
console.log("=====Key pressed=====");
console.log("Char:", JSON.stringify(char), "Evt:", JSON.stringify(evt));
if (char === "h") console.log("Hello World!");
if (char === "q") process.exit();
});
第一行,
require("readline").emitKeypressEvents(process.stdin)
使process.stdin
发出按键事件,因为它通常不发出事件。
第二个,
process.stdin.setRawMode(true)
使process.stdin
成为原始设备。在原始设备配置的流中,按键事件是按每个字符发出的,而不是按回车键发出的。
然后,将
keypress
事件监听器添加到 process.stdin
上以处理按键。
当
process.stdin
转换为原始设备时,Ctrl+C
不会发出SIGINT
信号,换句话说,Ctrl+C
不会停止程序。这意味着您需要手动绑定按键才能退出。
这就是我在节点 16.20.1 上的工作:
process.stdin.setRawMode(true);
process.stdin.on("data", function(charBuffer) {
const char = charBuffer.toString();
if (char === "q") {
process.exit();
}
console.log('do anything you want with this:', char);
});