21

所有四个箭头键(左上右下)的 utf8 代码是什么?

我正在学习 node.js,并且试图检测何时按下这些键。

这是我所做的,但没有一个捕获箭头键......我是 node.js 的新手,所以我可能会在这里做一些非常愚蠢的事情。

var stdin = process.stdin;
stdin.setRawMode(true);
stdin.resume();
stdin.setEncoding('utf8');

stdin.on('data', function(key){
    if (key === '39') {
        process.stdout.write('right'); 
    }
    if (key === 39) {
        process.stdout.write('right'); 
    }
    if (key == '39') {
            process.stdout.write('right'); 
    }
    if (key == 39) {
        process.stdout.write('right'); 
    }

    if (key == '\u0003') { process.exit(); }    // ctrl-c
});

谢谢。

4

5 回答 5

25

您可以使用按键包。尝试页面上给出的示例。

var keypress = require('keypress');

// make `process.stdin` begin emitting "keypress" events
keypress(process.stdin);

// listen for the "keypress" event
process.stdin.on('keypress', function (ch, key) {
  console.log('got "keypress"', key);
  if (key && key.ctrl && key.name == 'c') {
    process.stdin.pause();
  }
});

process.stdin.setRawMode(true);
process.stdin.resume();

您按顺序获得箭头键的 UTF-8 值。

> process.stdin.resume();got "keypress" { name: 'up',
  ctrl: false,
  meta: false,
  shift: false,
  sequence: '\u001b[A',
  code: '[A' }
> got "keypress" { name: 'down',
  ctrl: false,
  meta: false,
  shift: false,
  sequence: '\u001b[B',
  code: '[B' }
got "keypress" { name: 'right',
  ctrl: false,
  meta: false,
  shift: false,
  sequence: '\u001b[C',
  code: '[C' }
got "keypress" { name: 'left',
  ctrl: false,
  meta: false,
  shift: false,
  sequence: '\u001b[D',
  code: '[D' }
于 2013-07-04T15:07:10.850 回答
15

这应该可以解决您的问题:

var stdin = process.stdin;
stdin.setRawMode(true);
stdin.resume();
stdin.setEncoding('utf8');

stdin.on('data', function(key){
    if (key == '\u001B\u005B\u0041') {
        process.stdout.write('up'); 
    }
    if (key == '\u001B\u005B\u0043') {
        process.stdout.write('right'); 
    }
    if (key == '\u001B\u005B\u0042') {
        process.stdout.write('down'); 
    }
    if (key == '\u001B\u005B\u0044') {
        process.stdout.write('left'); 
    }

    if (key == '\u0003') { process.exit(); }    // ctrl-c
});

这也可能对您感兴趣:

stdin.on('data', function(key){
    console.log(toUnicode(key)); //Gives you the unicode of the pressed key
    if (key == '\u0003') { process.exit(); }    // ctrl-c
});

function toUnicode(theString) {
  var unicodeString = '';
  for (var i=0; i < theString.length; i++) {
    var theUnicode = theString.charCodeAt(i).toString(16).toUpperCase();
    while (theUnicode.length < 4) {
      theUnicode = '0' + theUnicode;
    }
    theUnicode = '\\u' + theUnicode;
    unicodeString += theUnicode;
  }
  return unicodeString;
}

我在这里找到了函数:http: //buildingonmud.blogspot.de/2009/06/convert-string-to-unicode-in-javascript.html

于 2015-06-06T20:46:45.503 回答
3

Moezalez 和 user568109 的混合答案对我有用:

var stdin = process.stdin;
// Don't set the rawMode to continue listening for other full length options.
stdin.resume();
stdin.setEncoding('utf8');

stdin.on('data', function(input) {
    // Take out the new line character at the end
    var option = input.substr(0, input.length - 1);
    switch (option) {
        case '\u001b[A':
            // Up
            break;
        case '\u001b[B':
            // Down
            break;
        case '\u001b[C':
            // Right
            break;
        case '\u001b[D':
            // Left
            break;
        case 'something_else':
            // Perform what something_else does 
            break;
    }
});
于 2015-06-24T03:34:52.823 回答
0

我自己是一个节点新手,但是 AFAIK 这不能像这样工作。单独的节点没有“前端”或用户界面 API,可以让您捕获用户输入。像箭头键这样的功能键不会发送到“stdin”,只是产生字符的键。

您可以通过命令行读取命令行参数或将数据发送到“stdin”,例如:

 echo "example" | node yourscript.js

或者

 node yourscript.js < test.txt

如果yourscript.js

process.stdin.resume();

process.stdin.on('data', function(chunk) {
  console.log('chunk: ' + chunk);
});

然后example(或 的内容test.txt)将回显到节点的控制台,但都不会允许您进行任何直接的用户交互。

对于使用“stdin”的更复杂的交互,请参阅http://docs.nodejitsu.com/articles/command-line/how-to-prompt-for-command-line-input,但是正如我所说的箭头键不发送到“stdin”,所以你不能捕获它们。

通常您将 node 用于 web 应用程序,因此您可以将 node 脚本编写为 web 服务器并使用浏览器作为前端。

或者您寻找提供前端的库/模块。我知道的是(我也没用过):

  • node-gui一个 GTK+ 绑定
  • node-webkit是一个基于 Chromium 的替代运行时,它允许您使用 HTML/CSS/JavaScript 编写前端。

我不知道是否有一个库允许通过控制台进行用户交互。

于 2013-07-04T14:51:05.357 回答
0

假设您的意思是关键代码:

Up: 38
Down: 40
Left: 37
Right: 39

http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes

要在 JavaScript 中捕获它们:

if (key.which == 39) {
    // go right!
}
于 2013-07-04T12:40:48.247 回答