The KeyboardEvent.code
property represents a physical key on the keyboard (as opposed to the character generated by pressing the key). In other words, this property returns a value which isn't altered by keyboard layout or the state of the modifier keys.
If the input device isn't a physical keyboard, but is instead a virtual keyboard or accessibility device, the returned value will be set by the browser to match as closely as possible to what would happen with a physical keyboard, to maximize compatibility between physical and virtual input devices.
This property is useful when you want to handle keys based on their physical positions on the input device rather than the characters associated with those keys; this is especially common when writing code to handle input for games which simulate a gamepad-like environment using keys on the keyboard. Be aware, however, that you can't use the value reported by KeyboardEvent.code
to determine the character generated by the keystroke, because the keycode's name may not match the actual character that's printed on the key or that's generated by the computer when the key is pressed.
For example, the code
returned is "KeyQ"
is for the "q" key on a QWERTY layout keyboard, but the same code
value also represents the "'" key on Dvorak keyboards and the "a" key on AZERTY keyboards. That makes it impossible to use the value of code
to determine name of the key is to users if they're not using an anticipated keyboard layout.
To determine what character corresponds with the key event, use the KeyboardEvent.key
property instead.
Examples
Exercising KeyboardEvent
HTML
<p>Press keys on the keyboard to see what the KeyboardEvent's key and code values are for each one.</p> <div id="output"> </div>
CSS
#output { font-family: Arial, Helvetica, sans-serif; border: 1px solid black; }
JavaScript
window.addEventListener("keydown", function(event) { let str = "KeyboardEvent: key='" + event.key + "' | code='" + event.code + "'"; let el = document.createElement("span"); el.innerHTML = str + "<br/>"; document.getElementById("output").appendChild(el); }, true);
Try it out
To ensure that keystrokes go to the sample, click in the output box below before pressing keys.
Handle keyboard events in a game
This example establishes an event listener for keydown
events which handles keyboard input for a game which uses the typical "WASD" keyboard layout for steering forward, left, backward, and right. This will use the same four keys physically regardless of what the actual corresponding characters are, such as if the user is using an AZERTY keyboard.
HTML
<p>Use the WASD (ZQSD on AZERTY) keys to move and steer.</p> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" class="world"> <polygon id="spaceship" points="15,0 0,30 30,30"/> </svg> <script>refresh();</script>
CSS
.world { margin: 0px; padding: 0px; background-color: black; width: 400px; height: 400px; } #spaceship { fill: orange; stroke: red; stroke-width: 2px; }
JavaScript
The first section of the JavaScript code establishes some variables we'll be using. shipSize
contains the size of the ship the player is moving around, for convenience. position
is used to track the position of the ship within the play field. moveRate
and turnRate
are the number of pixels forward and backward each keystroke moves the ship and how many degrees of rotation the left and right steering controls apply per keystroke. angle is the current amount of rotation applied to the ship, in degrees; it starts at 0° (pointing straight up). Finally, spaceship
is set to refer to the element with the ID "spaceship"
, which is the SVG polygon representing the ship the player controls.
let shipSize = { width: 30, height: 30 }; let position = { x: 200, y: 200 }; let moveRate = 9; let turnRate = 5; let angle = 0; let spaceship = document.getElementById("spaceship");
Next comes the function updatePosition()
. This function takes as input the distance the ship is to be moved, where positive is a forward movement and negative is a backward movement. This function computes the new position of the ship given the distance moved and the current direction the ship is facing. It also handles ensuring that the ship wraps across the boundaries of the play field instead of vanishing.
function updatePosition(offset) { let rad = angle * (Math.PI/180); position.x += (Math.sin(rad) * offset); position.y -= (Math.cos(rad) * offset); if (position.x < 0) { position.x = 399; } else if (position.x > 399) { position.x = 0; } if (position.y < 0) { position.y = 399; } else if (position.y > 399) { position.y = 0; } }
The refresh()
function handles applying the rotation and position by using an SVG transform.
function refresh() { let x = position.x - (shipSize.width/2); let y = position.y - (shipSize.height/2); let transform = "translate(" + x + " " + y + ") rotate(" + angle + " 15 15) "; spaceship.setAttribute("transform", transform); }
Finally, the addEventListener()
method is used to start listening for keydown
events, acting on each key by updating the ship position and rotation angle, then calling refresh()
to draw the ship at its new position and angle.
window.addEventListener("keydown", function(event) { if (event.preventDefaulted) { return; // Do nothing if event already handled } switch(event.code) { case "KeyS": case "ArrowDown": // Handle "back" updatePosition(-moveRate); break; case "KeyW": case "ArrowUp": // Handle "forward" updatePosition(moveRate); break; case "KeyA": case "ArrowLeft": // Handle "turn left" angle -= turnRate; break; case "KeyD": case "ArrowRight": // Handle "turn right" angle += turnRate; break; } refresh(); // Consume the event so it doesn't get handled twice event.preventDefault(); }, true);
Try it out
To ensure that keystrokes go to the sample code, click inside the black game play field below before pressing keys.
There are several ways this code can be made better. Most real games would watch for keydown
events, start motion when that happens, and stop the motion when the corresponding keyup
occurs, instead of relying on key repeats. That would allow both smoother and faster movement, but would also allow the player to be moving and steering at the same time. Transitions or animations could be used to make the ship's movement smoother, too.
Specification
Specification | Status | Comment |
---|---|---|
Document Object Model (DOM) Level 3 Events Specification The definition of 'KeyboardEvent.code' in that specification. |
Working Draft | Initial definition, included code values. |
Browser compatibility
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Microsoft Edge | Opera | Safari (WebKit) |
---|---|---|---|---|---|---|
Basic support | 48.0 | 32.0 (32.0) [1] | No support | No support [3] | (Yes) | 10.1 [2] |
Without scancode (Windows) | No support | 32.0 (32.0) | No support | No support | No support | No support |
Without scancode (Linux) | No support | No support | No support | No support | No support | No support |
Feature | Android | Android Webview | Firefox Mobile (Gecko) | IE Phone | Opera Mobile | Safari Mobile | Chrome for Android |
---|---|---|---|---|---|---|---|
Basic support | No support | No support | 32.0 (32.0) [1] | No support | No support | 10.1 [2] | No support |
Virtual keyboard | No support | ? | No support | No support | No support | No support | ? |
[1] Disabled on release builds until Firefox 38.
[3] Edge feature request on UserVoice
Code values
The following tables show what code values are used for each native scancode or virtual keycode on major platforms. Because some browsers choose to interpret physical keys differently, there are some differences in which keys map to which codes. These tables show those variations when known.
Code values on Windows
This table shows the Windows scan codes representing keys and the KeyboardEvent.code
values which correspond to those hardware keys. Only keys which generate scan codes on Windows are listed.
KeyboardEvent.code value |
||
---|---|---|
Code | Firefox | Chrome |
0x0000 |
Prior to Firefox 48, this key code is reported as |
"" |
0x0001 |
"Escape" |
"Escape" |
0x0002 |
"Digit0" |
"Digit0" |
0x0003 |
"Digit1" |
"Digit1" |
0x0004 |
"Digit2" |
"Digit2" |
0x0005 |
"Digit3" |
"Digit3" |
0x0006 |
"Digit4" |
"Digit4" |
0x0007 |
"Digit5" |
"Digit5" |
0x0008 |
"Digit6" |
"Digit6" |
0x0009 |
"Digit7" |
"Digit7" |
0x000A |
"Digit8" |
"Digit8" |
0x000B |
"Digit9" |
"Digit9" |
0x000C |
"Minus" |
"Minus" |
0x000D |
"Equal" |
"Equal" |
0x000E |
"Backspace" |
"Backspace" |
0x000F |
"Tab" |
"Tab" |
0x0010 |
"KeyQ" |
"KeyQ" |
0x0011 |
"KeyW" |
"KeyW" |
0x0012 |
"KeyE" |
"KeyE" |
0x0013 |
"KeyR" |
"KeyR" |
0x0014 |
"KeyT" |
"KeyT" |
0x0015 |
"KeyY" |
"KeyY" |
0x0016 |
"KeyU" |
"KeyU" |
0x0017 |
"KeyI" |
"KeyI" |
0x0018 |
"KeyO" |
"KeyO" |
0x0019 |
"KeyP" |
"KeyP" |
0x001A |
"BracketLeft" |
"BracketLeft" |
0x001B |
"BracketRight" |
"BracketRight" |
0x001C |
"Enter" |
"Enter" |
0x001D |
"ControlLeft" |
"ControlLeft" |
0x001E |
"KeyA" |
"KeyA" |
0x001F |
"KeyS" |
"KeyS" |
0x0020 |
"KeyD" |
"KeyD" |
0x0021 |
"KeyF" |
"KeyF" |
0x0022 |
"KeyG" |
"KeyG" |
0x0023 |
"KeyH" |
"KeyH" |
0x0024 |
"KeyJ" |
"KeyJ" |
0x0025 |
"KeyK" |
"KeyK" |
0x0026 |
"KeyL" |
"KeyL" |
0x0027 |
"Semicolon" |
"Semicolon" |
0x0028 |
"Quote" |
"Quote" |
0x0029 |
"Backquote" |
"Backquote" |
0x002A |
"ShiftLeft" |
"ShiftLeft" |
0x002B |
"Backslash" |
"Backslash" |
0x002C |
"KeyZ" |
"KeyZ" |
0x002D |
"KeyX" |
"KeyX" |
0x002E |
"KeyC" |
"KeyC" |
0x002F |
"KeyV" |
"KeyV" |
0x0030 |
"KeyB" |
"KeyB" |
0x0031 |
"KeyN" |
"KeyN" |
0x0032 |
"KeyM" |
"KeyM" |
0x0033 |
"Comma" |
"Comma" |
0x0034 |
"Period" |
"Period" |
0x0035 |
"Slash" |
"Slash" |
0x0036 |
"ShiftRight" |
"ShiftRight" |
0x0037 |
"NumpadMultiply" |
"NumpadMultiply" |
0x0038 |
"AltLeft" |
"AltLeft" |
0x0039 |
"Space" |
"Space" |
0x003A |
"CapsLock" |
"CapsLock" |
0x003B |
"F1" |
"F1" |
0x003C |
"F2" |
"F2" |
0x003D |
"F3" |
"F3" |
0x003E |
"F4" |
"F4" |
0x003F |
"F5" |
"F5" |
0x0040 |
"F6" |
"F6" |
0x0041 |
"F7" |
"F7" |
0x0042 |
"F8" |
"F8" |
0x0043 |
"F9" |
"F9" |
0x0044 |
"F10" |
"F10" |
0x0045 |
"Pause" |
"Pause" |
0x0046 |
"ScrollLock" |
"ScrollLock" |
0x0047 |
"Numpad7" |
"Numpad7" |
0x0048 |
"Numpad8" |
"Numpad8" |
0x0049 |
"Numpad9" |
"Numpad9" |
0x004A |
"NumpadSubtract" |
"NumpadSubtract" |
0x004B |
"Numpad4" |
"Numpad4" |
0x004C |
"Numpad5" |
"Numpad5" |
0x004D |
"Numpad6" |
"Numpad6" |
0x004E |
"NumpadAdd" |
"NumpadAdd" |
0x004F |
"Numpad1" |
"Numpad1" |
0x0050 |
"Numpad2" |
"Numpad2" |
0x0051 |
"Numpad3" |
"Numpad3" |
0x0052 |
"Numpad0" |
"Numpad0" |
0x0053 |
"NumpadDecimal" |
"NumpadDecimal" |
0x0054 (Alt + PrintScreen) |
"PrintScreen" |
"" |
0x0055 |
Prior to Firefox 48, this key code is reported as |
"" |
0x0056 |
"IntlBackslash" |
"IntlBackslash" |
0x0057 |
"F11" |
"F11" |
0x0058 |
"F12" |
"F12" |
0x0059 |
"NumpadEqual" |
"" |
0x005A |
Prior to Firefox 48, this key code is reported as |
"" |
0x005B |
Prior to Firefox 48, this key code is reported as |
"F13" |
0x005C |
Prior to Firefox 48, this key code is reported as |
"F14" |
0x005D |
Prior to Firefox 48, this key code is reported as |
"F15" |
0x005E |
Prior to Firefox 48, this key code is reported as |
"" |
0x005F |
Prior to Firefox 48, this key code is reported as |
"" |
0x0060 |
Prior to Firefox 48, this key code is reported as |
"" |
0x0061 |
Prior to Firefox 48, this key code is reported as |
"" |
0x0062 |
Prior to Firefox 48, this key code is reported as |
"" |
0x0063 |
Prior to Firefox 48, this key code is reported as |
"F16" |
0x0064 |
"F13" |
"F17" |
0x0065 |
"F14" |
"F18" |
0x0066 |
"F15" |
"F19" |
0x0067 |
"F16" |
"F20" |
0x0068 |
"F17" |
"F21" |
0x0069 |
"F18" |
"F22" |
0x006A |
"F19" |
"F23" |
0x006B |
"F20" |
"F24" |
0x006C |
"F21" |
"" |
0x006D |
"F22" |
"" |
0x006E |
"F23" |
"" |
0x006F |
Prior to Firefox 48, this key code is reported as |
"" |
0x0070 |
"KanaMode" |
"" |
0x0071 (Hanja key without Korean keyboard layout) |
"Lang2" |
"" |
0x0072 (Han/Yeong key without Korean keyboard layout) |
"Lang1" |
"" |
0x0073 |
"IntlRo" |
"" |
0x0074 , 0x0075 |
Prior to Firefox 48, this key code is reported as |
"" |
0x0076 |
"F24" |
"" |
0x0077 , 0x0078 |
Prior to Firefox 48, this key code is reported as |
"" |
0x0079 |
"Convert" |
"" |
0x007A |
Prior to Firefox 48, this key code is reported as |
"" |
0x007B |
"NonConvert" |
"" |
0x007C |
Prior to Firefox 48, this key code is reported as |
"" |
0x007D |
"IntlYen" |
"IntlYen" |
0x007E |
"NumpadComma" |
"" |
0x007F |
Prior to Firefox 48, this key code is reported as |
"" |
0xE000 ~ 0xE007 |
Prior to Firefox 48, this key code is reported as |
"" |
0xE008 |
Prior to Firefox 48, this key code is reported as |
"Undo" |
0xE009 |
Prior to Firefox 48, this key code is reported as |
"" |
0xE00A |
"" |
"Paste" |
0xE00B ~ 0xE00F |
"" | "" |
0xE010 |
"MediaTrackPrevious" |
"MediaTrackPrevious" |
0xE011 ~ 0xE016 |
"" |
"" |
0xE017 |
Prior to Firefox 48, this key code is reported as |
"Cut" |
0xE018 |
Prior to Firefox 48, this key code is reported as |
"Copy" |
0xE019 |
"MediaTrackNext" |
"MediaTrackNext" |
0xE01A, 0xE01B |
Prior to Firefox 48, this key code is reported as |
"" |
0xE01C |
"NumpadEnter" |
"NumpadEnter" |
0xE01D |
"ControlRight" |
"ControlRight" |
0xE01E |
Prior to Firefox 48, this key code is reported as |
"LaunchMail" |
0xE01F |
Prior to Firefox 48, this key code is reported as |
"" |
0xE020 |
"AudioVolumeMute" (was "VolumeMute" until Firefox 49) |
"AudioVolumeMute" (was "VolumeMute" until Chrome 50) |
0xE021 |
"LaunchApp2" |
"" |
0xE022 |
"MediaPlayPause" |
"MediaPlayPause" |
0xE023 |
Prior to Firefox 48, this key code is reported as |
"" |
0xE024 |
"MediaStop" |
"MediaStop" |
0xE025 ~ 0xE02B |
Prior to Firefox 48, this key code is reported as |
"" |
0xE02C |
Prior to Firefox 48, this key code is reported as |
"Eject" |
0xE02D |
Prior to Firefox 48, this key code is reported as |
"" |
0xE02E |
Prior to Firefox 48, this key code is reported as |
"VolumeDown" (was "VolumeDown" until Chrome 50) |
0xE02F |
Prior to Firefox 48, this key code is reported as |
"" |
0xE030 |
Prior to Firefox 48, this key code is reported as |
"VolumeUp" (was "VolumeUp" until Chrome 50) |
0xE031 |
Prior to Firefox 48, this key code is reported as |
"" |
0xE032 |
"BrowserHome" |
"BrowserHome" |
0xE033 , 0xE034 |
Prior to Firefox 48, this key code is reported as |
"" |
0xE035 |
"NumpadDivide" |
"NumpadDivide" |
0xE036 |
Prior to Firefox 48, this key code is reported as |
"" |
0xE037 |
"PrintScreen" |
"PrintScreen" |
0xE038 |
"AltRight" |
"AltRight" |
0xE039 , 0xE03A |
Prior to Firefox 48, this key code is reported as |
"" |
0xE03B |
Prior to Firefox 48, this key code is reported as |
"Help" |
0xE03C ~ 0xE044 |
Prior to Firefox 48, this key code is reported as |
"" |
0xE045 |
"NumLock" |
"NumLock" |
0xE046 (Ctrl + Pause) |
"Pause" |
"Pause" |
0xE047 |
"Home" |
"Home" |
0xE048 |
"ArrowUp" |
"ArrowUp" |
0xE049 |
"PageUp" |
"PageUp" |
0xE04A |
Prior to Firefox 48, this key code is reported as |
"" |
0xE04B |
"ArrowLeft" |
"ArrowLeft" |
0xE04C |
Prior to Firefox 48, this key code is reported as |
"" |
0xE04D |
"ArrowRight" |
"ArrowRight" |
0xE04E |
Prior to Firefox 48, this key code is reported as |
"" |
0xE04F |
"End" |
"End" |
0xE050 |
"ArrowDown" |
"ArrowDown" |
0xE051 |
"PageDown" |
"PageDown" |
0xE052 |
"Insert" |
"Insert" |
0xE053 |
"Delete" |
"Delete" |
0xE054 ~ 0xE05A |
Prior to Firefox 48, this key code is reported as |
"" |
0xE05B |
Prior to Firefox 48, this key code was reported as |
"OSLeft" |
0xE05C |
Prior to Firefox 48, this key code was reported as |
"OSRight" |
0xE05D |
"ContextMenu" |
"ContextMenu" |
0xE05E |
"Power" |
"" |
0xE05F ~ 0xE064 |
Prior to Firefox 48, this key code is reported as |
"" |
0xE065 |
"BrowserSearch" |
"BrowserSearch" |
0xE066 |
"BrowserFavorites" |
"BrowserFavorites" |
0xE067 |
"BrowserRefresh" |
"BrowserRefresh" |
0xE068 |
"BrowserStop" |
"BrowserStop" |
0xE069 |
"BrowserForward" |
"BrowserForward" |
0xE06A |
"BrowserBack" |
"BrowserBack" |
0xE06B |
"LaunchApp1" |
"" |
0xE06C |
"LaunchMail" |
"" |
0xE06D |
"LaunchMediaPlayer" ("MediaSelect" prior to Firefox 49) |
"" |
0xE06E ~ 0xE0F0 |
Prior to Firefox 48, this key code is reported as |
"" |
0xE0F1 (Hanja key with Korean keyboard layout) |
"Lang2" |
"" |
0xE0F2 (Han/Yeong key with Korean keyboard layout) |
"Lang1" |
"" |
Code values on Mac
On Mac OS X, it's hard to get scancode or something which can distinguish a physical key from a key event. Therefore, Gecko always maps code
value from the virtual keycode.
Virtual keycode | Gecko | Chromium (48) |
---|---|---|
kVK_ANSI_A (0x00) |
"KeyA" |
"KeyA" |
kVK_ANSI_S (0x01) |
"KeyS" |
"KeyS" |
kVK_ANSI_D (0x02) |
"KeyD" |
"KeyD" |
kVK_ANSI_F (0x03) |
"KeyF" |
"KeyF" |
kVK_ANSI_H (0x04) |
"KeyH" |
"KeyH" |
kVK_ANSI_G (0x05) |
"KeyG" |
"KeyG" |
kVK_ANSI_Z (0x06) |
"KeyZ" |
"KeyZ" |
kVK_ANSI_X (0x07) |
"KeyX" |
"KeyX" |
kVK_ANSI_C (0x08) |
"KeyC" |
"KeyC" |
kVK_ANSI_V (0x09) |
"KeyV" |
"KeyV" |
kVK_ISO_Section (0x0A) |
"IntlBackslash" |
"IntlBackslash" |
kVK_ANSI_B (0x0B) |
"KeyB" |
"KeyB" |
kVK_ANSI_Q (0x0C) |
"KeyQ" |
"KeyQ" |
kVK_ANSI_W (0x0D) |
"KeyW" |
"KeyW" |
kVK_ANSI_E (0x0E) |
"KeyE" |
"KeyE" |
kVK_ANSI_R (0x0F) |
"KeyR" |
"KeyR" |
kVK_ANSI_Y (0x10) |
"KeyY" |
"KeyY" |
kVK_ANSI_T (0x11) |
"KeyT" |
"KeyT" |
kVK_ANSI_1 (0x12) |
"Digit1" |
"Digit1" |
kVK_ANSI_2 (0x13) |
"Digit2" |
"Digit2" |
kVK_ANSI_3 (0x14) |
"Digit3" |
"Digit3" |
kVK_ANSI_4 (0x15) |
"Digit4" |
"Digit4" |
kVK_ANSI_6 (0x16) |
"Digit6" |
"Digit6" |
kVK_ANSI_5 (0x17) |
"Digit7" |
"Digit7" |
kVK_ANSI_Equal (0x18) |
"Equal" |
"Equal" |
kVK_ANSI_9 (0x19) |
"Digit9" |
"Digit9" |
kVK_ANSI_7 (0x1A) |
"Digit7" |
"Digit7" |
kVK_ANSI_Minus (0x1B) |
"Minus" |
"Minus" |
kVK_ANSI_8 (0x1C) |
"Digit8" |
"Digit8" |
kVK_ANSI_0 (0x1D) |
"Digit0" |
"Digit0" |
kVK_ANSI_RightBracket (0x1E) |
"BracketRight" |
"BracketRight" |
kVK_ANSI_O (0x1F) |
"KeyO" |
"KeyO" |
kVK_ANSI_U (0x20) |
"KeyU" |
"KeyU" |
kVK_ANSI_LeftBracket (0x21) |
"BracketLeft" |
"BracketLeft" |
kVK_ANSI_I (0x22) |
"KeyI" |
"KeyI" |
kVK_ANSI_P (0x23) |
"KeyP" |
"KeyP" |
kVK_Return (0x24) |
"Enter" |
"Enter" |
kVK_ANSI_L (0x25) |
"KeyL" |
"KeyL" |
kVK_ANSI_J (0x26) |
"KeyJ" |
"KeyJ" |
kVK_ANSI_Quote (0x27) |
"Quote" |
"Quote" |
kVK_ANSI_K (0x28) |
"KeyK" |
"KeyK" |
kVK_ANSI_Semicolon (0x29) |
"Semicolon" |
"Semicolon" |
kVK_Tab (0x30) |
"Tab" |
"Tab" |
kVK_Space (0x31) |
"Space" |
"Space" |
kVK_ANSI_Grave (0x32) |
"Backquote" |
"Backquote" |
kVK_Delete (0x33) |
"Backspace" |
"Backspace" |
Enter key on keypad of PowerBook (0x34 ) |
"NumpadEnter" |
"" |
kVK_Escape (0x35) |
"Escape" |
"Escape" |
right-command key (0x36 ) |
"OSRight" |
"OSRight" |
kVK_Command (0x37) |
"OSLeft" |
"OSLeft" |
kVK_Shift (0x38) |
"ShiftLeft" |
"ShiftLeft" |
kVK_CapsLock (0x39) |
"CapsLock" |
"CapsLock" |
kVK_Option (0x3A) |
"AltLeft" |
"AltLeft" |
kVK_Control (0x3B) |
"ControlLeft" |
"ControlLeft" |
kVK_RightShift (0x3C) |
"ShiftRight" |
"ShiftRight" |
kVK_RightOption (0x3D) |
"AltRight" |
"AltRight" |
kVK_RightControl (0x3E) |
"ControlRight" |
"ControlRight" |
kVK_Function (0x3F) |
"Fn" (no events fired actually) |
"" (no events fired actually) |
kVK_F17 (0x40) |
"F17" |
"F17" |
kVK_ANSI_KeypadDecimal (0x41) |
"NumpadDecimal" |
"NumpadDecimal" |
kVK_ANSI_KeypadMultiply (0x43) |
"NumpadMultiply" |
"NumpadMultiply" |
kVK_ANSI_KeypadPlus (0x45) |
"NumpadAdd" |
"NumpadAdd" |
kVK_ANSI_KeypadClear (0x47) |
"NumLock" |
"NumLock" |
kVK_VolumeUp (0x48) |
"AudioVolumeUp" (was "VolumeUp" until Firefox 48) |
"AudioVolumeUp" (was "VolumeUp" until Chrome 50) |
kVK_VolumeDown (0x49) |
"AudioVolumeDown" (was "VolumeDown" until Firefox 49) |
"AudioVolumeDown" (was "VolumeDown" until Chrome 50) |
kVK_Mute (0x4A) |
"AudioVolumeMute" (was "VolumeMute" until Firefox 49) |
"AudioVolumeMute" (was "VolumeMute" until Chrome 50) |
kVK_ANSI_KeypadDivide (0x4B) |
"NumpadDivide" |
"NumpadDivide" |
kVK_ANSI_KeypadEnter (0x4C) |
"NumpadEnter" |
"NumpadEnter" |
kVK_ANSI_KeypadMinus (0x4E) |
"NumpadSubtract" |
"NumpadSubtract" |
kVK_F18 (0x4F) |
"F18" |
"F18" |
kVK_F19 (0x50) |
"F19" |
"F19" |
kVK_ANSI_KeypadEquals (0x51) |
"NumpadEqual" |
"NumpadEqual" |
kVK_ANSI_Keypad0 (0x52) |
"Numpad0" |
"Numpad0" |
kVK_ANSI_Keypad1 (0x53) |
"Numpad1" |
"Numpad1" |
kVK_ANSI_Keypad2 (0x54) |
"Numpad2" |
"Numpad2" |
kVK_ANSI_Keypad3 (0x55) |
"Numpad3" |
"Numpad3" |
kVK_ANSI_Keypad4 (0x56) |
"Numpad4" |
"Numpad4" |
kVK_ANSI_Keypad5 (0x57) |
"Numpad5" |
"Numpad5" |
kVK_ANSI_Keypad6 (0x58) |
"Numpad6" |
"Numpad6" |
kVK_ANSI_Keypad7 (0x59) |
"Numpad7" |
"Numpad7" |
kVK_F20 (0x5A) |
"F20" |
"F20" |
kVK_ANSI_Keypad8 (0x5B) |
"Numpad8" |
"Numpad8" |
kVK_ANSI_Keypad9 (0x5C) |
"Numpad9" |
"Numpad9" |
kVK_JIS_Yen (0x5D) |
"IntlYen" |
"IntlYen" |
kVK_JIS_Underscore (0x5E) |
"IntlRo" |
"IntlRo" |
kVK_JIS_KeypadComma (0x5F) |
"NumpadComma" |
"NumpadComma" |
kVK_F5 (0x60) |
"F5" |
"F5" |
kVK_F6 (0x61) |
"F6" |
"F6" |
kVK_F7 (0x62) |
"F7" |
"F7" |
kVK_F3 (0x63) |
"F3" |
"F3" |
kVK_F8 (0x64) |
"F8" |
"F8" |
kVK_F9 (0x65) |
"F9" |
"F9" |
kVK_JIS_Eisu (0x66) |
Prior to Firefox 37, this key incorrectly generated the key code |
"" (no events fired actually) |
kVK_F11 (0x67) |
"F11" |
"F11" |
kVK_JIS_Kana (0x68) |
"Lang1" |
"KanaMode" (no events fired actually) |
kVK_F13 (0x69) |
"F13" |
"F13" |
kVK_F16 (0x6A) |
"F16" |
"F16" |
kVK_F14 (0x6B) |
"F14" |
"F14" |
kVK_F10 (0x6D) |
"F10" |
"F10" |
kVK_F12 (0x6F) |
"F12" |
"F12" |
kVK_F15 (0x71) |
"F15" |
"F15" |
kVK_Help (0x72) |
"Help" |
"Insert" |
kVK_Home (0x73) |
"Home" |
"Home" |
kVK_PageUp (0x74) |
"PageUp" |
"PageUp" |
kVK_ForwardDelete (0x75) |
"Delete" |
"Delete" |
kVK_F4 (0x76) |
"F4" |
"F4" |
kVK_End (0x77) |
"End" |
"End" |
kVK_F2 (0x78) |
"F2" |
"F2" |
kVK_PageDown (0x79) |
"PageDown" |
"PageDown" |
kVK_F1 (0x7A) |
"F1" |
"F1" |
kVK_LeftArrow (0x7B) |
"ArrowLeft" |
"ArrowLeft" |
kVK_RightArrow (0x7C) |
"ArrowRight" |
"ArrowRight" |
kVK_DownArrow (0x7D) |
"ArrowDown" |
"ArrowDown" |
kVK_UpArrow (0x7E) |
"ArrowUp" |
"ArrowUp" |
Code values on Linux (X11) (When scancode is available)
Note that X has too many keys and some of them are not testable with usual keyboard. So, following table is created from source code which maps from scancode to code value.
scancode (hardware_keycode) | Gecko | Chromium (44) |
---|---|---|
0x0009 |
"Escape" |
"Escape" |
0x000A |
"Digit1" |
"Digit1" |
0x000B |
"Digit2" |
"Digit2" |
0x000C |
"Digit3" |
"Digit3" |
0x000D |
"Digit4" |
"Digit4" |
0x000E |
"Digit5" |
"Digit5" |
0x000F |
"Digit6" |
"Digit6" |
0x0010 |
"Digit7" |
"Digit7" |
0x0011 |
"Digit8" |
"Digit8" |
0x0012 |
"Digit9" |
"Digit9" |
0x0013 |
"Digit0" |
"Digit0" |
0x0014 |
"Minus" |
"Minus" |
0x0015 |
"Equal" |
"Equal" |
0x0016 |
"Backspace" |
"Backspace" |
0x0017 |
"Tab" |
"Tab" |
0x0018 |
"KeyQ" |
"KeyQ" |
0x0019 |
"KeyW" |
"KeyW" |
0x001A |
"KeyE" |
"KeyE" |
0x001B |
"KeyR" |
"KeyR" |
0x001C |
"KeyT" |
"KeyT" |
0x001D |
"KeyY" |
"KeyY" |
0x001E |
"KeyU" |
"KeyU" |
0x001F |
"KeyI" |
"KeyI" |
0x0020 |
"KeyO" |
"KeyO" |
0x0021 |
"KeyP" |
"KeyP" |
0x0022 |
"BracketLeft" |
"BracketLeft" |
0x0023 |
"BracketRight" |
"BracketRight" |
0x0024 |
"Enter" |
"Enter" |
0x0025 |
"ControlLeft" |
"ControlLeft" |
0x0026 |
"KeyA" |
"KeyA" |
0x0027 |
"KeyS" |
"KeyS" |
0x0028 |
"KeyD" |
"KeyD" |
0x0029 |
"KeyF" |
"KeyF" |
0x002A |
"KeyG" |
"KeyG" |
0x002B |
"KeyH" |
"KeyH" |
0x002C |
"KeyJ" |
"KeyJ" |
0x002D |
"KeyK" |
"KeyK" |
0x002E |
"KeyL" |
"KeyL" |
0x002F |
"Semicolon" |
"Semicolon" |
0x0030 |
"Quote" |
"Quote" |
0x0031 |
"Backquote" |
"Backquote" |
0x0032 |
"ShiftLeft" |
"ShiftLeft" |
0x0033 |
"Backslash" |
"Backslash" |
0x0034 |
"KeyZ" |
"KeyZ" |
0x0035 |
"KeyX" |
"KeyX" |
0x0036 |
"KeyC" |
"KeyC" |
0x0037 |
"KeyV" |
"KeyV" |
0x0038 |
"KeyB" |
"KeyB" |
0x0039 |
"KeyN" |
"KeyN" |
0x003A |
"KeyM" |
"KeyM" |
0x003B |
"Comma" |
"Comma" |
0x003C |
"Period" |
"Period" |
0x003D |
"Slash" |
"Slash" |
0x003E |
"ShiftRight" |
"ShiftRight" |
0x003F |
"NumpadMultiply" |
"NumpadMultiply" |
0x0040 |
"AltLeft" |
"AltLeft" |
0x0041 |
"Space" |
"Space" |
0x0042 |
"CapsLock" |
"CapsLock" |
0x0043 |
"F1" |
"F1" |
0x0044 |
"F2" |
"F2" |
0x0045 |
"F3" |
"F3" |
0x0046 |
"F4" |
"F4" |
0x0047 |
"F5" |
"F5" |
0x0048 |
"F6" |
"F6" |
0x0049 |
"F7" |
"F7" |
0x004A |
"F8" |
"F8" |
0x004B |
"F9" |
"F9" |
0x004C |
"F10" |
"F10" |
0x004D |
"NumLock" |
"NumLock" |
0x004E |
"ScrollLock" |
"ScrollLock" |
0x004F |
"Numpad7" |
"Numpad7" |
0x0050 |
"Numpad8" |
"Numpad8" |
0x0051 |
"Numpad9" |
"Numpad9" |
0x0052 |
"NumpadSubtract" |
"NumpadSubtract" |
0x0053 |
"Numpad4" |
"Numpad4" |
0x0054 |
"Numpad5" |
"Numpad5" |
0x0055 |
"Numpad6" |
"Numpad6" |
0x0056 |
"NumpadAdd" |
"NumpadAdd" |
0x0057 |
"Numpad1" |
"Numpad1" |
0x0058 |
"Numpad2" |
"Numpad2" |
0x0059 |
"Numpad3" |
"Numpad3" |
0x005A |
"Numpad0" |
"Numpad0" |
0x005B |
"NumpadDecimal" |
"NumpadDecimal" |
0x005C , 0x005D |
"Unidentified" |
"" |
0x005E |
"IntlBackslash" |
"IntlBackslash" |
0x005F |
"F11" |
"F11" |
0x0060 |
"F12" |
"F12" |
0x0061 |
"IntlRo" |
"IntlRo" |
0x0062 , 0x0063 |
"Unidentified" |
"" |
0x0064 |
"Convert" |
"Convert" |
0x0065 |
"KanaMode" |
"KanaMode" |
0x0066 |
"NonConvert" |
"NonConvert" |
0x0067 |
"Unidentified" |
"" |
0x0068 |
"NumpadEnter" |
"NumpadEnter" |
0x0069 |
"ControlRight" |
"ControlRight" |
0x006A |
"NumpadDivide" |
"NumpadDivide" |
0x006B |
"PrintScreen" |
"PrintScreen" |
0x006C |
"AltRight" |
"AltRight" |
0x006D |
"Unidentified" |
"" |
0x006E |
"Home" |
"Home" |
0x006F |
"ArrowUp" |
"ArrowUp" |
0x0070 |
"PageUp" |
"PageUp" |
0x0071 |
"ArrowLeft" |
"ArrowLeft" |
0x0072 |
"ArrowRight" |
"ArrowRight" |
0x0073 |
"End" |
"End" |
0x0074 |
"ArrowDown" |
"ArrowDown" |
0x0075 |
"PageDown" |
"PageDown" |
0x0076 |
"Insert" |
"Insert" |
0x0077 |
"Delete" |
"Delete" |
0x0078 |
"Unidentified" |
"" |
0x0079 |
"AudioVolumeMute" (was "VolumeMute" until Firefox 49) |
"AudioVolumeMute" (was "VolumeMute" until Chrome 50) |
0x007A |
"AudioVolumeDown" (was "VolumeDown" until Firefox 49) |
"AudioVolumeDown" (was "VolumeDown" until Chrome 50) |
0x007B |
"AudioVolumeUp" (was "VolumeUp" until Firefox 49) |
"AudioVolumeUp" (was "VolumeUp" until Chrome 50) |
0x007C |
"Unidentified" |
"Power" |
0x007D |
"NumpadEqual" |
"NumpadEqual" |
0x007E |
"Unidentified" |
"NumpadChangeSign" |
0x007F |
"Pause" |
"Pause" |
0x0080 |
"Unidentified" |
"" |
0x0081 |
"NumpadComma" |
"" |
0x0082 |
"Lang1" |
"HangulMode" |
0x0083 |
"Lang2" |
"Hanja" |
0x0084 |
"IntlYen" |
"IntlYen" |
0x0085 |
"OSLeft" |
"OSLeft" |
0x0086 |
"OSRight" |
"OSRight" |
0x0087 |
"ContextMenu" |
"ContextMenu" |
0x0088 |
"BrowserStop" |
"Cancel" |
0x0089 |
"Again" | "" |
0x008A |
"Props" |
"" |
0x008B |
"Undo" |
"Undo" |
0x008C |
"Select" |
"" |
0x008D |
"Copy" |
"Copy" |
0x008E |
"Open" |
"" |
0x008F |
"Paste" |
"Paste" |
0x0090 |
"Find" |
"" |
0x0091 |
"Cut" |
"Cut" |
0x0092 |
"Help" |
"Help" |
0x0093 |
"Unidentified" |
"" |
0x0094 |
"LaunchApp2" |
"" |
0x0095 , 0x0096 |
"Unidentified" |
"" |
0x0097 |
"WakeUp" |
"" |
0x0098 |
"LaunchApp1" |
"" |
0x0099 ~ 0x00A2 |
"Unidentified" |
"" |
0x00A3 |
"LaunchMail" |
"" |
0x00A4 |
"BrowserFavorites" |
"" |
0x00A5 |
"Unidentified" |
"" |
0x00A6 |
"BrowserBack" |
"BrowserBack" |
0x00A7 |
"BrowserForward" |
"BrowserForward" |
0x00A8 |
"Unidentified" |
"" |
0x00A9 |
"Eject" |
"" |
0x00AA |
"Unidentified" |
"" |
0x00AB |
"MediaTrackNext" |
"" |
0x00AC |
"MediaPlayPause" |
"" |
0x00AD |
"MediaTrackPrevious" |
"" |
0x00AE |
"MediaStop" |
"" |
0x00AF ~ 0x00B2 |
"Unidentified" |
"" |
0x00B3 |
"LaunchMediaPlayer" ("MediaSelect" prior to Firefox 49) |
"" |
0x00B4 |
"BrowserHome" |
"" |
0x00B5 |
"BrowserRefresh" |
"BrowserRefresh" |
0x00B6 ~ 0x00BA |
"Unidentified" |
"" |
0x00BB |
Prior to Firefox 48, this key code is reported as |
"NumpadParenLeft" |
0x00BC |
Prior to Firefox 48, this key code is reported as |
"NumpadParenRight" |
0x00BD , 0x00BE |
Prior to Firefox 48, this key code is reported as |
"" |
0x00BF |
"F13" |
"" |
0x00C0 |
"F14" |
"" |
0x00C1 |
"F15" |
"" |
0x00C2 |
"F16" |
"" |
0x00C3 |
"F17" |
"" |
0x00C4 |
"F18" |
"" |
0x00C5 |
"F19" |
"" |
0x00C6 |
"F20" |
"" |
0x00C7 |
"F21" |
"" |
0x00C8 |
"F22" |
"" |
0x00C9 |
"F23" |
"" |
0x00CA |
"F24" |
"" |
0x00CB ~ 0x00E0 |
Prior to Firefox 48, this key code is reported as |
"" |
0x00E1 |
"BrowserSearch" |
"" |
Code values on Android and Firefox OS (When scancode is available)
scancode | Gecko |
---|---|
0x0001 |
"Escape" |
0x0002 |
"Digit1" |
0x0003 |
"Digit2" |
0x0004 |
"Digit3" |
0x0005 |
"Digit4" |
0x0006 |
"Digit5" |
0x0007 |
"Digit6" |
0x0008 |
"Digit7" |
0x0009 |
"Digit8" |
0x000A |
"Digit9" |
0x000B |
"Digit0" |
0x000C |
"Minus" |
0x000D |
"Equal" |
0x000E |
"Backspace" |
0x000F |
"Tab" |
0x0010 |
"KeyQ" |
0x0011 |
"KeyW" |
0x0012 |
"KeyE" |
0x0013 |
"KeyR" |
0x0014 |
"KeyT" |
0x0015 |
"KeyY" |
0x0016 |
"KeyU" |
0x0017 |
"KeyI" |
0x0018 |
"KeyO" |
0x0019 |
"KeyP" |
0x001A |
"BracketLeft" |
0x001B |
"BracketRight" |
0x001C |
"Enter" |
0x001D |
"ControlLeft" |
0x001E |
"KeyA" |
0x001F |
"KeyS" |
0x0020 |
"KeyD" |
0x0021 |
"KeyF" |
0x0022 |
"KeyG" |
0x0023 |
"KeyH" |
0x0024 |
"KeyJ" |
0x0025 |
"KeyK" |
0x0026 |
"KeyL" |
0x0027 |
"Semicolon" |
0x0028 |
"Quote" |
0x0029 |
"Backquote" |
0x002A |
"ShiftLeft" |
0x002B |
"Backslash" |
0x002C |
"KeyZ" |
0x002D |
"KeyX" |
0x002E |
"KeyC" |
0x002F |
"KeyV" |
0x0030 |
"KeyB" |
0x0031 |
"KeyN" |
0x0032 |
"KeyM" |
0x0033 |
"Comma" |
0x0034 |
"Period" |
0x0035 |
"Slash" |
0x0036 |
"ShiftRight" |
0x0037 |
"NumpadMultiply" |
0x0038 |
"AltLeft" |
0x0039 |
"Space" |
0x003A |
"CapsLock" |
0x003B |
"F1" |
0x003C |
"F2" |
0x003D |
"F3" |
0x003E |
"F4" |
0x003F |
"F5" |
0x0040 |
"F6" |
0x0041 |
"F7" |
0x0042 |
"F8" |
0x0043 |
"F9" |
0x0044 |
"F10" |
0x0045 |
"NumLock" |
0x0046 |
"ScrollLock" |
0x0047 |
"Numpad7" |
0x0048 |
"Numpad8" |
0x0049 |
"Numpad9" |
0x004A |
"NumpadSubtract" |
0x004B |
"Numpad4" |
0x004C |
"Numpad5" |
0x004D |
"Numpad6" |
0x004E |
"NumpadAdd" |
0x004F |
"Numpad1" |
0x0050 |
"Numpad2" |
0x0051 |
"Numpad3" |
0x0052 |
"Numpad0" |
0x0053 |
"NumpadDecimal" |
0x0054 , 0x0055 |
Prior to Firefox 48, this key code is reported as |
0x0056 |
"IntlBackslash" |
0x0057 |
"F11" |
0x0058 |
"F12" |
0x0059 |
"IntlRo" |
0x005A , 0x005B |
Prior to Firefox 48, this key code is reported as |
0x005C |
"Convert" |
0x005D |
"KanaMode" |
0x005E |
"NonConvert" |
0x005F |
Prior to Firefox 48, this key code is reported as |
0x0060 |
"NumpadEnter" |
0x0061 |
"ControlRight" |
0x0062 |
"NumpadDivide" |
0x0063 |
"PrintScreen" |
0x0064 |
"AltRight" |
0x0065 |
Prior to Firefox 48, this key code is reported as |
0x0066 |
"Home" |
0x0067 |
"ArrowUp" |
0x0068 |
"PageUp" |
0x0069 |
"ArrowLeft" |
0x006A |
"ArrowRight" |
0x006B |
"End" |
0x006C |
"ArrowDown" |
0x006D |
"PageDown" |
0x006E |
"Insert" |
0x006F |
"Delete" |
0x0070 |
Prior to Firefox 48, this key code is reported as |
0x0071 |
Prior to Firefox 48, this key code is identifi9ed as |
0x0072 |
Prior to Firefox 48, this key code is identifi9ed as |
0x0073 |
Prior to Firefox 48, this key code is identifi9ed as |
0x0074 |
"Power" |
0x0075 |
"NumpadEqual" |
0x0076 |
Prior to Firefox 48, this key code is reported as |
0x0077 |
"Pause" |
0x0078 |
Prior to Firefox 48, this key code is reported as |
0x0079 |
"NumpadComma" |
0x007A |
"Lang1" |
0x007B |
"Lang2" |
0x007C |
"IntlYen" |
0x007D |
Prior to Firefox 48, this key code is reported as |
0x007E |
Prior to Firefox 49, this key code is reported as |
0x007F |
"ContextMenu" |
0x0080 |
"BrowserStop" |
0x0081 |
"Again" |
0x0082 |
"Props" |
0x0083 |
"Undo" |
0x0084 |
"Select" |
0x0085 |
"Copy" |
0x0086 |
"Open" |
0x0087 |
"Paste" |
0x0088 |
"Find" |
0x0089 |
"Cut" |
0x008A |
"Help" |
0x008B ~ 0x008D |
Prior to Firefox 48, this key code is reported as |
0x008E |
"Sleep" |
0x008F |
"WakeUp" |
0x0090 |
"LaunchApp1" |
0x0091 ~ 0x009B |
Prior to Firefox 48, this key code is reported as |
0x009C |
"BrowserFavorites" |
0x009D |
Prior to Firefox 48, this key code is reported as |
0x009E |
"BrowserBack" |
0x009F |
"BrowserForward" |
0x00A0 |
Prior to Firefox 48, this key code is reported as |
0x00A1 |
"Eject" |
0x00A2 |
Prior to Firefox 48, this key code is reported as |
0x00A3 |
"MediaTrackNext" |
0x00A4 |
"MediaPlayPause" |
0x00A5 |
"MediaTrackPrevious" |
0x00A6 |
"MediaStop" |
0x00A7 ~ 0x00AC |
Prior to Firefox 48, this key code is reported as |
0x00AD |
"BrowserRefresh" |
0x00AE ~ 0x00B6 |
"Unidentified" Prior to Firefox 48, this key code is reported as "" (an empty string). |
0x00B7 |
"F13" |
0x00B8 |
"F14" |
0x00B9 |
"F15" |
0x00BA |
"F16" |
0x00BB |
"F17" |
0x00BC |
"F18" |
0x00BD |
"F19" |
0x00BE |
"F20" |
0x00BF |
"F21" |
0x00C0 |
"F22" |
0x00C1 |
"F23" |
0x00C2 |
"F24" |
0x00C3 ~ 0x00D8 |
Prior to Firefox 48, this key code is reported as |
0x00D9 |
"BrowserSearch" |
0x00DA ~ 0x01CF |
Prior to Firefox 48, this key code is reported as |
0x01D0 |
"Fn" |