Определить, является ли JavaScript e.keyCode печатным (неконтролируемым) символом
Я просто хотел бы узнать диапазон (-ы) JavaScript keyCode
, который соответствует печатаемым символам; или, альтернативно, диапазон непечатаемых (управляющих) символов, таких как backspace, escape, command, shift и т.д., поэтому я могу их игнорировать.
Причина, по которой я спрашиваю: вызов String.fromCharCode()
приводит к нечетным символам для ключей управления. Например, я получаю "[" для левой команды, "%" для стрелки влево. Такая странность.
Ответы
Ответ 1
Keydown даст вам keyCode нажатой клавиши без каких-либо изменений.
$("#keypresser").keydown(function(e){
var keycode = e.keyCode;
var valid =
(keycode > 47 && keycode < 58) || // number keys
keycode == 32 || keycode == 13 || // spacebar & return key(s) (if you want to allow carriage returns)
(keycode > 64 && keycode < 91) || // letter keys
(keycode > 95 && keycode < 112) || // numpad keys
(keycode > 185 && keycode < 193) || // ;=,-./` (in order)
(keycode > 218 && keycode < 223); // [\]' (in order)
return valid;
});
Только числовые клавиши, буквенные клавиши и пробел будут иметь коды клавиш, соответствующие String.fromCharCode
, поскольку используются значения Unicode.
Keypress - это представление введенного текста charCode. Обратите внимание, что это событие не будет срабатывать, если текст не будет "распечатан" в результате нажатия клавиши.
$("#keypresser").keypress(function(e){
var charcode = e.charCode;
var char = String.fromCharCode(charcode);
console.log(char);
});
http://jsfiddle.net/LZs2D/1/ Покажет, как они работают.
KeyUp ведет себя аналогично KeyDown.
Ответ 2
Как раз для фона, событие "keypress" даст вам свойство charCode всякий раз, когда вы нажимаете клавишу символа.
Editor.addEventListener('keypress', function(event){
if (event.charCode) {
//// character key
console.log( String.fromCharCode(event.charCode) ); /// convert charCode to intended character.
} else {
//// control key
}
Однако событие "keypress" не захватывает каждое нажатие клавиши - несколько клавиш загораются перед событием "keypress".
Напротив, событие "keydown" будет захватывать каждое нажатие клавиши, но у него нет свойства charCode. Итак, как мы можем определить, является ли это символьным ключом? Проверка каждого нажатия клавиши, если ключевой код находится в пределах нижней и верхней границ для нескольких диапазонов, не является оптимально эффективной. Я подозреваю, что есть также проблемы для символов вне диапазона ASCII.
Мой подход - проверка длины свойства "ключ" события. Свойство "ключ" является альтернативой "keyCode" для определения того, какой ключ был нажат. Для ключей управления свойство "ключ" является описательным (например, "rightArrow", "F12", "return" и т.д.). Для символьных клавиш свойство "ключ" для символьного ключа - это только символ (например, "a", "A", "~", "\" и т.д.). Следовательно, для каждого символьного ключа длина свойства "ключ" будет иметь длину 1; тогда как управляющие символы будут иметь длину больше 1.
Editor.addEventListener('keydown', function(event){
if (event.key.length == 1){
//// character key
} else {
//// control key
}
})
Ответ 3
В этой статье есть список keyCodes
в Javascript
:
http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes
Ответ 4
Вы также можете использовать RegEx для этого:
$(".input").keyup(function (event) {
if (event.key.match(/^[\d\w]$/i)) {
// put function to trigger when a digit or a word character is pressed here
}
флаг i
делает выражение нечувствительным к регистру.