At first I thought this was a bug, as the expected lowercase value is returned for the keypress
event. It turns out that on keyup/keydown
the ASCII uppercase/non-shifted version of a key is always returned.
From this link: http://www.javascriptkit.com/jsref/eventkeyboardmouse.shtml
Be careful when accessing the keyCode
property during an onkeydown or
onkeyup event, as it is set whenever
any key is pressed, including non
character keys like "Shift". This
means if you try to press "Shift+a" to
try and get the keyCode for "A", you
will always end up getting two
keyCodes instead, one for "Shift" and
one for "A" in that order. What you
won't get regardless is the keyCode
for "a", as keyCode always returns
the unicode value of the uppercase
version of a character
- Pressing Shift+a counts as a single
keypress
event.
- Pressing Shift+a counts as two
keydown
events when the keys are pressed down and two keyup
event when the keys are released.
keypress
returns the composite value of one or more keys being pressed in unison.
keydown
and keyup
return the value of a single key while ignoring any key combinations.
Now here's the confusing part: for some reason the unshifted value of the a
key is returned as key code 65. But 65 is uppercase A in the ASCII table. So somewhere along the line the browser is taking the lowercase a (ASCII code 97), transforming it to uppercase A, then passing it keydown/keyup
as the non-shifted character. Weird, isn't it?