Javascript/jQuery: невозможно получить правильный код, когда capsLock включен
Я пытаюсь определить правильный код ключа / символа в JavaScript, когда клавиша нажата. Кажется, что при включенной клавише CapsLock строчные буквы не обнаруживаются.
Try the combinations:
1. a = a (97) shift:false
2. Shift+A = A (65) shift:true
3. Capslock,A = A (65) shift:false
4. Capslock, Shift+A = A (65) shift:true -- this should be 'a'
Случаи 2 и 4 неразличимы.
Простая скрипка для иллюстрации проблемы. http://jsfiddle.net/sramam/pet5G/3/
OUTPUT:
keypress 'a' shift:false charCode97 keyCode:97 which:97
keypress 'A' shift:true charCode65 keyCode:65 which:65
(CAPSLOCK ON)
keypress 'A' shift:false charCode65 keyCode:65 which:65
keypress 'A' shift:true charCode65 keyCode:65 which:65
У меня есть только MacPro(Lion), чтобы примерить это. Можно ли даже определить символ, который будет правильно отображен?
3 ответа
Обнаружение нажатия клавиши на самом деле "правильно". Проблема, с которой вы сталкиваетесь, заключается в том, что в OS X Lion, если вы включаете caps lock и нажимаете shift, она игнорирует caps lock. В Windows, shift + caps lock вернет строчные буквы. На вашем Mac он будет возвращать заглавные буквы. Дело не в том, как браузер интерпретирует нажатие клавиш, а в том, что регистрирует операционная система.
Попробуйте набрать в ЛЮБОМ приложении, т.е. Терминале, и вы увидите, что я имею в виду.
Это может иметь место в других версиях Mac OS, я проверял это на своем MacBook Air с OS X Lion.
Код нажатия клавиши является правильным в окнах, возвращая правильные коды клавиш для буквы, как это будет напечатано при нажатии клавиш.
CAPS LOCK ON:
PRINTED
CHARACTER keyup/down keypress Modifiers
z 90 122 +Shift
a 65 97 +Shift
Z 90 90
A 65 65
caps lock off:
Z 90 90 +Shift
A 65 65 +Shift
z 90 122
a 65 97
События keydown, keyup и keypress поддерживаются всеми браузерами, но есть некоторые проблемы взаимодействия, потому что значения свойства keyCode объекта события никогда не были стандартизированы.
// The legacy keyCode property of the keydown event object is not standardized
// But the following values seem to work for most browsers and OSes.
Keymap.keyCodeToKeyName = {
// Keys with words or arrows on them
8:"Backspace", 9:"Tab", 13:"Enter", 16:"Shift", 17:"Control", 18:"Alt",
19:"Pause", 20:"CapsLock", 27:"Esc", 32:"Spacebar", 33:"PageUp",
34:"PageDown", 35:"End", 36:"Home", 37:"Left", 38:"Up", 39:"Right", 40:"Down", 45:"Insert", 46:"Del",
// Number keys on main keyboard (not keypad)
48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",
// Letter keys. Note that we don't distinguish upper and lower case
65:"A", 66:"B", 67:"C", 68:"D", 69:"E", 70:"F", 71:"G", 72:"H", 73:"I", 74:"J", 75:"K", 76:"L", ` 77:"M", 78:"N", 79:"O", 80:"P", 81:"Q", 82:"R", 83:"S", 84:"T", 85:"U", 86:"V", 87:"W", 88:"X", 89:"Y", 90:"Z",`
// Keypad numbers and punctuation keys. (Opera does not support these.)
96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9", 106:"Multiply", 107:"Add", 109:"Subtract", 110:"Decimal", 111:"Divide",
// Function keys
112:"F1", 113:"F2", 114:"F3", 115:"F4", 116:"F5", 117:"F6", 118:"F7", 119:"F8", 120:"F9", 121:"F10", 122:"F11", 123:"F12", 124:"F13", 125:"F14", 126:"F15", 127:"F16", 128:"F17", 129:"F18", 130:"F19", 131:"F20", 132:"F21", 133:"F22", 134:"F23", 135:"F24",
// Punctuation keys that don't require holding down Shift
// Hyphen is nonportable: FF returns same code as Subtract
59:";", 61:"=", 186:";", 187:"=", // Firefox and Opera return 59,61 188:",", 190:".", 191:"/", 192:"`", 219:"[", 220:"\\", 221:"]", 222:"'"
};