OnKeyDown и String.FromCharCode - PullRequest
       3

OnKeyDown и String.FromCharCode

4 голосов
/ 25 января 2011

У меня вопрос по поводу события OnKeyDown. Событие OnKeyDown дает KeyCode, но я не знаю точно, какой код предоставляется. По сути, я использовал метод String.FromCharCode, чтобы получить реальный символ из того, что я считал ASCII-кодом. Это работало хорошо, пока я не попробовал с номерами от numpad. Если я наберу '2', используя клавишу выше 'w', это нормально, но с цифрой '2' с цифровой клавиатуры, данный KeyCode будет равен 98 (это код Ascii 'b').

Я смотрел на эту страницу , и там та же проблема. Предполагается, что пример запрещает пользователю вводить цифры. Он отлично работает с числами сверху первого символа (из-за отсутствия лучшего имени), но вы можете набирать числа с помощью цифровой клавиатуры.

Ты хоть представляешь, в чем проблема? (действительно ли это код ascii? Я использую неправильное событие?) ...

ТНХ ...

Ответы [ 4 ]

7 голосов
/ 25 января 2011

Чтобы запретить номера, используйте onkeypress вместо:

onkeypress="return PreventDigits(event);"
...
function PreventDigits(evt) {
    evt = evt || window.event;
    var keyCode = evt.keyCode || evt.which;7
    var num = parseInt(String.fromCharCode(keyCode), 10);
    return isNaN(num);
}

Живой пример: http://jsfiddle.net/yahavbr/vwc7a/

3 голосов
/ 25 января 2011

keyCode и charCode - разные животные. keyCode относится к раскладке клавиатуры и клавиш, тогда как charCode фактически дает код символа ascii.

Кроме того, есть много плохого в различных реализациях ключевых событий. Мне всегда нравилась эта страница как хороший источник: http://unixpapa.com/js/key.html

Редактировать: Как говорит Рейнос, пропустите w3schools, когда он появится в поиске Google.

3 голосов
/ 25 января 2011

Числа, возвращаемые из сопоставления кода ключа в следующий набор, как определено здесь . Этот набор не соответствует ASCII, но похож в некоторых отношениях. Я посмотрю и смогу найти дополнительную информацию о том, как получить символы из чисел.

Также я рекомендую использовать e.which вместо e.keyCode

И, как дальнейший комментарий, никогда не доверяйте w3schools.

Взгляните на e.originalEvent.keyIdentifier, похоже, он содержит какой-то юникод. Но он все равно отображает цифровую клавиатуру в A-H вместо 0-9. Я думаю, что это просто ненавидит numpad. Где-то должен быть логический флаг isnumpad. DOM3 API имеет логический номер.

Получается e.originalEvent.keyLocation === 3, когда вы нажимаете 1 на цифровой клавиатуре.

Из W3 spec

KeyboardEvent.DOM_KEY_LOCATION_STANDARD Значение константы KeyboardEvent.DOM_KEY_LOCATION_STANDARD равно 0x00. KeyboardEvent.DOM_KEY_LOCATION_LEFT Значение константы KeyboardEvent.DOM_KEY_LOCATION_LEFT равно 0x01. KeyboardEvent.DOM_KEY_LOCATION_RIGHT Значение константы KeyboardEvent.DOM_KEY_LOCATION_RIGHT равно 0x02. KeyboardEvent.DOM_KEY_LOCATION_NUMPAD Значение константы KeyboardEvent.DOM_KEY_LOCATION_NUMPAD равно 0x03

Таким образом, расположение клавиш === 3 отображается на DOM_KEY_LOCATION_NUMPAD. Тогда вам придется ловить цифровую клавиатуру вручную. Вы можете вычесть 48 из кода клавиши для цифровой клавиатуры, чтобы отобразить A-H на 0-9

[Большой отказ от ответственности]

Это то, что делают FF & Chrome. Бог знает, что делает IE, вы можете победить этого зверя самостоятельно. Я не сомневаюсь, что это делает что-то совершенно отличное от спецификации W3.

0 голосов
/ 01 февраля 2012

FF (по крайней мере v.10.0) не имеет свойства события "originalEvent.KeyLocation", как в Chrome. Вы можете использовать этот фрагмент кода JS для распознавания числовых чисел, если ваше текстовое поле должно быть только числовое . Это также полностью кросс-браузер:

var my_char=e.which;
if(e.which>95 && e.which<106){
    my_char=(e.which-96).toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...