Подтвердить что ты не робот

Как захватить клавиши со стрелками в node.js

Что такое код 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
});

Спасибо.

4b9b3361

Ответ 1

Вы можете использовать keypress пакет. Попробуйте пример, указанный на странице.

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' }

Ответ 2

Это должно решить вашу проблему:

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

Ответ 4

Для меня работала смесь ответов 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;
    }
});

Ответ 5

Я новичок node сам, но AFAIK это не может работать так. node самостоятельно не имеет интерфейса "front end" или 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) будет отправлено в консоль node, но ни одно из них не позволит вам прямого взаимодействия с пользователем.

Для более сложного взаимодействия с использованием "stdin" см. http://docs.nodejitsu.com/articles/command-line/how-to-prompt-for-command-line-input, однако, как я уже говорил, клавиши со стрелками не отправляются на "stdin", поэтому вы не можете их захватить.

Обычно вы используете node для веб-приложений, поэтому вы можете написать свой node script в качестве веб-сервера и использовать браузер в качестве интерфейса.

Или вы ищете библиотеки/модули, которые предоставляют интерфейс. Я знаю (я тоже не использовал):

  • node-gui привязка GTK +
  • node-webkit альтернативное время исполнения на основе Chromium, которое позволяет писать интерфейсы в HTML/CSS/JavaScript.

Я не знаю, есть ли библиотека, которая позволяет пользователю взаимодействовать через консоль.