Как захватить клавиши со стрелками в 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
});
Спасибо.
Ответы
Ответ 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
Ответ 3
Предполагая, что вы имеете в виду коды клавиш:
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!
}
Ответ 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.
Я не знаю, есть ли библиотека, которая позволяет пользователю взаимодействовать через консоль.