Получить правильный код ключа для клавиш клавиатуры (numpad)
Я получаю коды [96..105] при нажатии клавиш на клавиатуре [0..9] Эти коды соответствуют символам: 'abcdefgh i' вместо [0..9] при попытке получить код таким способом. String.fromCharCode(event.keyCode).
Вопрос:
У меня есть 3 ввода в форме. Пользователь может войти только в первый вход. В то время как пользователь нажимает клавиши на клавиатуре, некоторые функции должны фильтровать его и записывать на второй вход, если нажатая клавиша является цифрой, в противном случае она должна записать ее на второй вход. Как это можно исправить? Пожалуйста, смотрите ссылку ниже, поскольку она описывает весь мой поток и коды, которые я реализовал
вот мой код
Ответы
Ответ 1
Используйте обработчик keypress
:
[somelement].onkeypress = function(e){
e = e || event;
console.log(String.fromCharCode(e.keyCode));
}
Смотрите также: этот тестовый документ W3C
если вы хотите использовать обработчик keyup
или keydown
, вы можете вычесть 48 из e.keyCode
, чтобы получить номер (так String.fromCharCode(e.keyCode-48)
)
Ответ 2
Я исправил проблему, используя следующий код javascript. Клавиши numpad лежат между 96 и 105. но реальные цифры меньше 48 из значений numpad. Работает с обработчиком keyup или keydown.
var keyCode = e.keyCode || e.which;
if (keyCode >= 96 && keyCode <= 105) {
// Numpad keys
keyCode -= 48;
}
var number = String.fromCharCode(keyCode);
Ответ 3
Существует способ сделать это с помощью keydown, если keypress не работает из-за необходимости отмены событий и т.д. Используйте инструкцию if() с этим тестом:
parseInt(event.keyIdentifier.substring(2),16) > 47 && parseInt(event.keyIdentifier.substring(2),16) < 58
ИЛИ, с событиями jQuery:
parseInt(event.originalEvent.keyIdentifier.substring(2),16) > 47 && parseInt(event.originalEvent.keyIdentifier.substring(2),16) < 58
В этих примерах предполагается, что "событие" - это событие keydown. keyIdentifier - это шестнадцатеричное число, которое представляет значение unicode для соответствующего char. Используя keyIdentifier, цифры с цифровой клавиатуры и клавиатуры, а числа над клавиатурой QWERTY будут иметь одинаковые значения, 48 - 57 (U + 0030 - U + 0039), даже с событием keyDown.
Значения Unicode в браузерах будут выглядеть как U + 0030 или U + 002F. Разберите эту строку, чтобы получить только шестнадцатеричное значение, затем используйте parseInt() с радиусом 16, чтобы преобразовать его в base-10.
Ответ 4
Ok. Но в Firfox Gecko Это не работает. Я использую следующий код, и я доволен этим:)
[somelement].onkeypress = function(e){
var singleChar=e.key || String.fromCharCode(e.keyCode);
console.log(singleChar);
}
Ответ 5
event.charCode at onKeyPress возвращает тот же код, когда нажимает номер на клавиатуре и клавиатуре.
но event.keyCode at onKeyDown (или вверх) возвращает другой код.
= > get char: использовать event.charCode при событии onKeyPress event.preventDefault() (или event.returnValue = false в IE) для использования числа event.keyCode при событии onKeyDown
Ответ 6
Я думаю, что более безопасный способ не предполагает использование ключей значения, которые будут использоваться. Вы можете получить рабочее значение с помощью объекта KeyboardEvent и получить доступ к его свойствам "DOM_VK_ *". Позвольте привести пример.
const kcN0=KeyboardEvent.DOM_VK_0;//get the 0 key value (commonly,48)
const kcN9=KeyboardEvent.DOM_VK_9;//get the 9 key value (commonly, 57)
const kcNPad0=KeyboardEvent.DOM_VK_NUMPAD0;//get the NUMPAD 0 key value (commonly,96)
const kcNPad9=KeyboardEvent.DOM_VK_NUMPAD9;//get the NUMPAD 9 key value (commonly,105)
const kcNPad_L=KeyboardEvent.DOM_KEY_LOCATION_NUMPAD;//get the key location of NUMPAD (commonly, 3)
и оценить переменную события "kbEv"
let pressKeyCode=(kbEv.which||kbEv.keyCode); if( kbEv.location===kcNPad_L && pressKeyCode>=kcNumP0 && pressKeyCode<=kcNumP9 ) pressKeyCode=kcN0+kcNPad9-pressKeyCode;
Я только предположил, что от 0 до 9 будет последовательным в этих двух непересекающихся наборах цифровых цифр.