KeyboardEvent: keyCode property
===============================

**Deprecated:** This feature is no longer recommended. Though some browsers might still support it, it may have already been removed from the relevant web standards, may be in the process of being dropped, or may only be kept for compatibility purposes. Avoid using it, and update existing code if possible; see the compatibility table at the bottom of this page to guide your decision. Be aware that this feature may cease to work at any time.

The deprecated **`KeyboardEvent.keyCode`** read-only property represents a system and implementation dependent numerical code identifying the unmodified value of the pressed key.

This is usually the decimal ASCII (RFC 20) or Windows 1252 code corresponding to the key. If the key can't be identified, this value is `0`.

You should avoid using this if possible; it's been deprecated for some time. Instead, you should use `KeyboardEvent.code`, if it's implemented. Unfortunately, some browsers still don't have it, so you'll have to be careful to make sure you use one which is supported on all target browsers.

**Note:** Web developers shouldn't use the `keyCode` attribute for printable characters when handling `keydown` and `keyup` events. As described above, the `keyCode` attribute is not useful for printable characters, especially those input with the `Shift` or `Alt` key pressed. When implementing a shortcut key handler, the `keypress` event is usually better (at least when Gecko is the runtime in use).

Examples
--------


```js
window.addEventListener(
  "keydown",
  (event) => {
    if (event.defaultPrevented) {
      return; // Should do nothing if the default action has been cancelled
    }

    let handled = false;
    if (event.key !== undefined) {
      // Handle the event with KeyboardEvent.key
      handled = true;
    } else if (event.keyCode !== undefined) {
      // Handle the event with KeyboardEvent.keyCode
      handled = true;
    }

    if (handled) {
      // Suppress "double action" if event handled
      event.preventDefault();
    }
  },
  true,
);
```

Specifications
--------------

| Specification |
| --- |
| UI Events # dom-keyboardevent-keycode |

Browser compatibility
---------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

Value of keyCode
----------------

### Printable keys in standard position

The value of key events which are caused by pressing or releasing printable keys in standard position is not compatible between browsers.

IE just exposes the native virtual keycode value as `KeyboardEvent.keyCode`.

Google Chrome, Chromium and Safari must decide the value from the input character. If the inputting character can be inputted with the US keyboard layout, they use the `keyCode` value on the US keyboard layout.

Firefox gets `keyCode` values from ASCII characters inputtable by the key — even with shift modifiers or an ASCII capable keyboard layout. See the following rules for details:

1. If the system is Windows and the native keycode of the pressed key indicates that the key is a-z or 0-9, use a keycode for it.
2. If the system is Mac and the native keycode of the pressed key indicates that the key is 0-9, use a keycode for it.
3. If the pressed key inputs an ASCII alphabetic or numeric character with no modifier key, use a keycode for it.
4. If the pressed key inputs an ASCII alphabetic or numeric character with a Shift key modifier, use a keycode for it.
5. If the pressed key inputs a different ASCII character with no modifier key, use a keycode for it.
6. If the pressed key inputs a different ASCII character with a Shift key modifier, use a keycode for it.
7. Otherwise, i.e., pressed key inputs a unicode character:
    1. If the keyboard layout is ASCII-capable (i.e., can input ASCII alphabets), use 0 or compute with the following additional rules.
    2. Otherwise, i.e., the keyboard layout isn't ASCII capable, use the ASCII capable keyboard layout installed on the environment with the highest priority:
        1. If the pressed key on the alternative keyboard layout inputs an ASCII alphabetic or numeric character, use a keycode for it.
        2. Otherwise, use 0 or compute with the following additional rules.

Gecko sets `keyCode` values of punctuation keys as far as possible (when points 7.1 or 7.2 in the above list are reached) with the following rules:

**Warning:** The purpose of these new additional rules is for making users whose keyboard layouts map unicode characters to punctuation keys in a US keyboard layout can use web applications which support Firefox only with ASCII-capable keyboard layouts or just with a US keyboard layout. Otherwise, the newly mapped `keyCode` values may be conflict with other keys. For example, if the active keyboard layout is Russian, the `keyCode` value of **both** the `"Period"` key and `"Slash"` key are `190` (`KeyEvent.DOM_VK_PERIOD`). If you need to distinguish those keys but you don't want to support all keyboard layouts in the world by yourself, you should probably use `KeyboardEvent.code`.

1. If running macOS or Linux:
    1. If the active keyboard layout is not ASCII-capable and an alternative ASCII-capable keyboard layout is available.
        1. If the alternative ASCII-capable keyboard layout produces an ASCII character via just the unmodified key, use a `keyCode` for the character.
        2. If the alternative ASCII-capable keyboard layout produces an ASCII character with a Shift key modifier, use a `keyCode` for the shifted character.
        3. Otherwise, use a `keyCode` for an ASCII character produced by the key when the US keyboard layout is active.
    2. Otherwise, use a `keyCode` for an ASCII character produced by the key when the US keyboard layout is active.
2. If running on Windows:
    1. Use a `keyCode` value for an ASCII character produced by a key which is mapped to the same virtual keycode of Windows when the US keyboard layout is active.


 keyCode values of each browser's keydown event caused by printable keys in
 standard position
 | `KeyboardEvent.code` | IE 11 | Google Chrome 34 | Chromium 34 | Safari 7 | Gecko 29 |
| --- | --- | --- | --- | --- | --- |
|  | Windows | Windows | Mac (10.9) | Linux (Ubuntu 14.04) | Mac (10.9) | Windows | Mac (10.9) | Linux (Ubuntu 14.04) |
|  | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek |
| `"Digit1"` | `0x31 (49)` | `0x31 (49)` | `0x31 (49)` | `0x31 (49)` | `0x31 (49)` | `0x31 (49)` | `0x31 (49)` | `0x31 (49)` |
| `"Digit2"` | `0x32 (50)` | `0x32 (50)` | `0x32 (50)` | `0x32 (50)` | `0x32 (50)` | `0x32 (50)` | `0x32 (50)` | `0x32 (50)` |
| `"Digit3"` | `0x33 (51)` | `0x33 (51)` | `0x33 (51)` | `0x33 (51)` | `0x33 (51)` | `0x33 (51)` | `0x33 (51)` | `0x33 (51)` |
| `"Digit4"` | `0x34 (52)` | `0x34 (52)` | `0x34 (52)` | `0x34 (52)` | `0x34 (52)` | `0x34 (52)` | `0x34 (52)` | `0x34 (52)` |
| `"Digit5"` | `0x35 (53)` | `0x35 (53)` | `0x35 (53)` | `0x35 (53)` | `0x35 (53)` | `0x35 (53)` | `0x35 (53)` | `0x35 (53)` |
| `"Digit6"` | `0x36 (54)` | `0x36 (54)` | `0x36 (54)` | `0x36 (54)` | `0x36 (54)` | `0x36 (54)` | `0x36 (54)` | `0x36 (54)` |
| `"Digit7"` | `0x37 (55)` | `0x37 (55)` | `0x37 (55)` | `0x37 (55)` | `0x37 (55)` | `0x37 (55)` | `0x37 (55)` | `0x37 (55)` |
| `"Digit8"` | `0x38 (56)` | `0x38 (56)` | `0x38 (56)` | `0x38 (56)` | `0x38 (56)` | `0x38 (56)` | `0x38 (56)` | `0x38 (56)` |
| `"Digit9"` | `0x39 (57)` | `0x39 (57)` | `0x39 (57)` | `0x39 (57)` | `0x39 (57)` | `0x39 (57)` | `0x39 (57)` | `0x39 (57)` |
| `"Digit0"` | `0x30 (48)` | `0x30 (48)` | `0x30 (48)` | `0x30 (48)` | `0x30 (48)` | `0x30 (48)` | `0x30 (48)` | `0x30 (48)` |
| `"KeyA"` | `0x41 (65)` | `0x41 (65)` | `0x41 (65)` | `0x41 (65)` | `0x41 (65)` | `0x41 (65)` | `0x41 (65)` | `0x41 (65)` |
| `"KeyB"` | `0x42 (66)` | `0x42 (66)` | `0x42 (66)` | `0x42 (66)` | `0x42 (66)` | `0x42 (66)` | `0x42 (66)` | `0x42 (66)` |
| `"KeyC"` | `0x43 (67)` | `0x43 (67)` | `0x43 (67)` | `0x43 (67)` | `0x43 (67)` | `0x43 (67)` | `0x43 (67)` | `0x43 (67)` |
| `"KeyD"` | `0x44 (68)` | `0x44 (68)` | `0x44 (68)` | `0x44 (68)` | `0x44 (68)` | `0x44 (68)` | `0x44 (68)` | `0x44 (68)` |
| `"KeyE"` | `0x45 (69)` | `0x45 (69)` | `0x45 (69)` | `0x45 (69)` | `0x45 (69)` | `0x45 (69)` | `0x45 (69)` | `0x45 (69)` |
| `"KeyF"` | `0x46 (70)` | `0x46 (70)` | `0x46 (70)` | `0x46 (70)` | `0x46 (70)` | `0x46 (70)` | `0x46 (70)` | `0x46 (70)` |
| `"KeyG"` | `0x47 (71)` | `0x47 (71)` | `0x47 (71)` | `0x47 (71)` | `0x47 (71)` | `0x47 (71)` | `0x47 (71)` | `0x47 (71)` |
| `"KeyH"` | `0x48 (72)` | `0x48 (72)` | `0x48 (72)` | `0x48 (72)` | `0x48 (72)` | `0x48 (72)` | `0x48 (72)` | `0x48 (72)` |
| `"KeyI"` | `0x49 (73)` | `0x49 (73)` | `0x49 (73)` | `0x49 (73)` | `0x49 (73)` | `0x49 (73)` | `0x49 (73)` | `0x49 (73)` |
| `"KeyJ"` | `0x4A (74)` | `0x4A (74)` | `0x4A (74)` | `0x4A (74)` | `0x4A (74)` | `0x4A (74)` | `0x4A (74)` | `0x4A (74)` |
| `"KeyK"` | `0x4B (75)` | `0x4B (75)` | `0x4B (75)` | `0x4B (75)` | `0x4B (75)` | `0x4B (75)` | `0x4B (75)` | `0x4B (75)` |
| `"KeyL"` | `0x4C (76)` | `0x4C (76)` | `0x4C (76)` | `0x4C (76)` | `0x4C (76)` | `0x4C (76)` | `0x4C (76)` | `0x4C (76)` |
| `"KeyM"` | `0x4D (77)` | `0x4D (77)` | `0x4D (77)` | `0x4D (77)` | `0x4D (77)` | `0x4D (77)` | `0x4D (77)` | `0x4D (77)` |
| `"KeyN"` | `0x4E (78)` | `0x4E (78)` | `0x4E (78)` | `0x4E (78)` | `0x4E (78)` | `0x4E (78)` | `0x4E (78)` | `0x4E (78)` |
| `"KeyO"` | `0x4F (79)` | `0x4F (79)` | `0x4F (79)` | `0x4F (79)` | `0x4F (79)` | `0x4F (79)` | `0x4F (79)` | `0x4F (79)` |
| `"KeyP"` | `0x50 (80)` | `0x50 (80)` | `0x50 (80)` | `0x50 (80)` | `0x50 (80)` | `0x50 (80)` | `0x50 (80)` | `0x50 (80)` |
| `"KeyQ"` | `0x51 (81)` | `0x51 (81)` | `0x51 (81)` | `0x51 (81)` | `0xBA (186)⚠️` | `0x51 (81)` | `0x51 (81)` | `0xBA (186)⚠️` | `0x51 (81)` | `0x51 (81)` | `0xBA (186)⚠️` | `0x51 (81)` | `0x51 (81)` | `0x51 (81)` | `0xBA (186)⚠️` | `0x51 (81)` |
| `"KeyR"` | `0x52 (82)` | `0x52 (82)` | `0x52 (82)` | `0x52 (82)` | `0x52 (82)` | `0x52 (82)` | `0x52 (82)` | `0x52 (82)` |
| `"KeyS"` | `0x53 (83)` | `0x53 (83)` | `0x53 (83)` | `0x53 (83)` | `0x53 (83)` | `0x53 (83)` | `0x53 (83)` | `0x53 (83)` |
| `"KeyT"` | `0x54 (84)` | `0x54 (84)` | `0x54 (84)` | `0x54 (84)` | `0x54 (84)` | `0x54 (84)` | `0x54 (84)` | `0x54 (84)` |
| `"KeyU"` | `0x55 (85)` | `0x55 (85)` | `0x55 (85)` | `0x55 (85)` | `0x55 (85)` | `0x55 (85)` | `0x55 (85)` | `0x55 (85)` |
| `"KeyV"` | `0x56 (86)` | `0x56 (86)` | `0x56 (86)` | `0x56 (86)` | `0x56 (86)` | `0x56 (86)` | `0x56 (86)` | `0x56 (86)` |
| `"KeyW"` | `0x57 (87)` | `0x57 (87)` | `0x57 (87)` | `0x57 (87)` | `0x57 (87)` | `0x57 (87)` | `0x57 (87)` | `0x57 (87)` |
| `"KeyX"` | `0x58 (88)` | `0x58 (88)` | `0x58 (88)` | `0x58 (88)` | `0x58 (88)` | `0x58 (88)` | `0x58 (88)` | `0x58 (88)` |
| `"KeyY"` | `0x59 (89)` | `0x59 (89)` | `0x59 (89)` | `0x59 (89)` | `0x59 (89)` | `0x59 (89)` | `0x59 (89)` | `0x59 (89)` |
| `"KeyZ"` | `0x5A (90)` | `0x5A (90)` | `0x5A (90)` | `0x5A (90)` | `0x5A (90)` | `0x5A (90)` | `0x5A (90)` | `0x5A (90)` |
| `KeyboardEvent.code` | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Windows | Windows | Mac (10.9) | Linux (Ubuntu 14.04) | Mac (10.9) | Windows | Mac (10.9) | Linux (Ubuntu 14.04) |
| Internet Explorer 11 | Google Chrome 34 | Chromium 34 | Safari 7 | Gecko 29 |


 keyCode values of each browser's keydown event caused by printable keys in
 standard position (punctuations in US layout):
 | `KeyboardEvent.code` | IE 11 | Google Chrome 34 | Chromium 34 | Safari 7 | Gecko 29 |
| --- | --- | --- | --- | --- | --- |
|  | Windows | Windows | Mac (10.9) | Linux (Ubuntu 14.04) | Mac (10.9) | Windows (10.9) | Mac (10.9) | Linux (Ubuntu 14.04) |
|  | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek |
| `"Comma"` | `0xBC (188)` | `0xBC (188)` | `0xBC (188)` | `0xBC (188)` | `0xBC (188)` | `0xBC (188)` | `0xBC (188)` | `0xBC (188)` |
| `"Comma"` with `Shift` |
| `"Period"` | `0xBE (190)` | `0xBE (190)` | `0xBE (190)` | `0xBE (190)` | `0xBE (190)` | `0xBE (190)` | `0xBE (190)` | `0xBE (190)` |
| `"Period"` with `Shift` |
| `"Semicolon"` | `0xBA (186)` | `0xBB (187)`⚠️ | `0xBA (186)` | `0xBA (186)` | `0xBB (187)`⚠️ | `0xBA (186)` | `0xBA (186)` | `0xBA (186)` [1] | `0xE5 (229)`⚠️ [2] | `0xBA (186)` | `0xBA (186)` | `0xE5 (229)`⚠️ [3] | `0xBA (186)` | `0xBA (186)` [1] | `0xE5 (229)`⚠️ [2] | `0x3B (59)` | `0x3B (59)` | `0x00 (0)`⚠️ | `0x3B (59)` | `0x3B (59)` [1] | `0x00 (0)`⚠️ | `0x3B (59)` | `0x3B (59)` | `0x00 (0)`⚠️ |
| `"Semicolon"` with `Shift` | `0xBB (187)`⚠️ [1] | `0xBB (187)`⚠️ | `0xBB (187)`⚠️ [1] |
| `"Quote"` | `0xDE (222)` | `0xBA (186)`⚠️ | `0xDE (222)` | `0xDE (222)` | `0xBA (186)`⚠️ | `0xDE (222)` | `0xDE (222)` | `0xBA (186)`⚠️ [1] | `0xDE (222)` | `0xDE (222)` | `0xBA (186)`⚠️ | `0xDE (222)` | `0xDE (222)` | `0xBA (186)`⚠️ [1] | `0xDE (222)` | `0xDE (222)` | `0x3A (58)`⚠️ | `0xDE (222)` | `0xDE (222)` | `0x3A (58)`⚠️ [1] | `0xDE (222)` | `0xDE (222)` | `0x3A (58)`⚠️ | `0xDE (222)` |
| `"Quote"` with Shift | `0xDE (222)`⚠️ [1] | `0x38 (56)`⚠️ | `0xDE (222)`⚠️ [1] |
| `"BracketLeft"` | `0xDB (219)` | `0xC0(192)`⚠️ | `0xDB (219)` | `0xDB (219)` | `0xC0(192)`⚠️ | `0xDB (219)` | `0xDB (219)` | `0xDB (219)` [1] | `0xDB (219)` | `0xDB (219)` | `0x32 (50)`⚠️ | `0xDB (219)` | `0xDB (219)` | `0xDB (219)` [1] | `0xDB (219)` | `0xDB (219)` | `0x40 (64)`⚠️ | `0xDB (219)` | `0xDB (219)` | `0x40 (64)`⚠️ [1] | `0xDB (219)` | `0xDB (219)` | `0x40 (64)`⚠️ | `0xDB (219)` |
| `"BracketLeft"` with `Shift` | `0xC0 (192)`⚠️ [1] | `0xC0 (192)`⚠️ | `0xC0 (192)`⚠️ [1] |
| `"BracketRight"` | `0xDD (221)` | `0xDB (219)`⚠️ | `0xDD (221)` | `0xDD (221)` | `0xDB (219)`⚠️ | `0xDD (221)` | `0xDD (221)` | `0xDB (219)`⚠️ [1] | `0xDD (221)` | `0xDD (221)` | `0xDB (219)`⚠️ | `0xDD (221)` | `0xDD (221)` | `0xDB (219)`⚠️ [1] | `0xDD (221)` | `0xDD (221)` | `0xDB (219)`⚠️ | `0xDD (221)` | `0xDD (221)` | `0xDB (219)`⚠️ [1] | `0xDD (221)` | `0xDD (221)` | `0xDB (219)`⚠️ | `0xDD (221)` |
| `"BracketRight"` with `Shift` |
| `"Backquote"` | `0xC0 (192)` | `❌ N/A` | `0xC0 (192)` | `0xC0 (192)` | `❌ N/A` | `0xC0 (192)` | `0xC0 (192)` | `0xC0 (192)` | `0xF4 (244)`⚠️ | `0xC0 (192)` | `0xC0 (192)` | `0xC0 (192)` | `❌ N/A` | `0xC0 (192)` | `0xC0 (192)` | `0xC0 (192)` | `0x00 (0)` | `0xC0 (192)` |
| `"Backquote"` with `Shift` |
| `"Backslash"` | `0xDC (220)` | `0xDD (221)`⚠️ | `0xDC (220)` | `0xDC (220)` | `0xDD (221)`⚠️ | `0xDC (220)` | `0xDC (220)` | `0xDC (220)` | `0xDD (221)`⚠️ | `0xDC (220)` | `0xDC (220)` | `0xDC (220)` | `0xDD (221)`⚠️ | `0xDC (220)` | `0xDC (220)` | `0xDC (220)` | `0xDD (221)`⚠️ | `0xDC (220)` |
| `"Backslash"` with `Shift` |
| `"Minus"` | `0xBD (189)` | `0xBD (189)` | `0xBD (189)` | `0xBD (189)` [1] | `0xBD (189)` | `0xBD (189)` | `0xBD (189)` | `0xBD (189)` | `0xBD (189)` | `0xBD (189)` [1] | `0xBD (189)` | `0xAD (173)` | `0xAD (173)` | `0xAD (173)`[1] | `0xAD (173)` | `0xAD (173)` |
| `"Minus"` with `Shift` | `0xBB (187)`⚠️ [1] | `0xBB (187)`⚠️ | `0xBD (189)` | `0xBB (187)`⚠️ [1] | `0xBD (189)` |
| `"Equal"` | `0xBB (187)` | `0xDE (222)`⚠️ | `0xBB (187)` | `0xBB (187)` | `0xDE (222)`⚠️ | `0xBB (187)` | `0xBB (187)` | `0xBB (187)` [1] | `0xBB (187)` | `0xBB (187)` | `0x36 (54)`⚠️ | `0xBB (187)` | `0xBB (187)` | `0xBB (187)`[1] | `0xBB (187)` | `0x3D (61)` | `0xA0 (160)`⚠️ | `0x3D (61)` | `0x3D (61)` | `0xA0 (160)`⚠️ [1] | `0x3D (61)` | `0x3D (61)` | `0xA0 (160)`⚠️ | `0x3D (61)` |
| `"Equal"` with `Shift` | `0xC0 (192)`⚠️ [1] | `0xC0 (192)`⚠️ | `0xBB (187)` | `0xC0 (192)`⚠️ [1] | `0xBB (187)` |
| `"IntlRo"` | `0xC1 (193)` | `0xE2 (226)`⚠️ | `0xC1 (193)` | `0xC1 (193)` | `0xE2 (226)`⚠️ | `0xC1 (193)` | `0xBD (189)` | `0xBD (189)` | `0x00 (0)`⚠️ | [4] | `0xDC (220)`⚠️ | [4] | `0xBD (189)` | `0xBD (189)` | `0xE5 (229)`⚠️ [5] | `0x00 (0)` | `0xDC (220)`⚠️ | `0x00 (0)` | `0xA7 (167)` | `0xA7 (167)` | `0x00 (0)` | `0x00 (0)` | `0xDC (220)`⚠️ | `0x00 (0)` |
| `"IntlRo"` with `Shift` |
| `"IntlYen"` | `0xFF (255)` | `0xDC (220)`⚠️ | `0xFF (255)` | `0xFF (255)` | `0xDC (220)`⚠️ | `0xFF (255)` | `0x00 (0)`⚠️ | `0x00 (0)`⚠️ | `0x00 (0)`⚠️ | [4] | `0xDC (220)`⚠️ | [4] | `0x00 (0)`⚠️ | `0x00 (0)`⚠️ | `0xE5 (229)`⚠️ [5] | `0x00 (0)`⚠️ | `0xDC (220)`⚠️ | `0x00 (0)`⚠️ | `0xDC` (220) | `0xDC` (220) | `0x00 (0)`⚠️ | `0x00 (0)`⚠️ | `0xDC (220)`⚠️ | `0x00 (0)`⚠️ |
| `"IntlYen"` with `Shift` | `0xDC (220)` | `0xDC (220)` | `0xBD (189)`⚠️ | `0xDC (220)` | `0xDC (220)` |
| `KeyboardEvent.code` | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek | US | Japanese | Greek |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Windows | Windows | Mac (10.9) | Linux (Ubuntu 14.04) | Mac (10.9) | Windows | Mac (10.9) | Linux (Ubuntu 14.04) |
| Internet Explorer 11 | Google Chrome 34 | Chromium 34 | Safari 7 | Gecko 29 |

[1] The value is input from JIS keyboard. When you use ANSI keyboard, the keyCode value and inputted character are what you select from the US keyboard layout.

[2] The key is a dead key. The value of `keyup` event is `0xBA (186)`.

[3] The key is a dead key. The value of `keyup` event is `0x10 (16)`.

[4] No key events are fired.

[5] The key isn't available with Greek keyboard layout (does not input any character). The value of `keyup` event is `0x00 (0)`.

### Non-printable keys (function keys)

keyCode values of each browser's keydown event caused by modifier keys:| `KeyboardEvent.code` | IE 11 | Google Chrome 34 | Chromium 34 | Safari 7 | Gecko 29 |
| --- | --- | --- | --- | --- | --- |
| Windows | Windows | Mac (10.9) | Linux (Ubuntu 14.04) | Mac (10.9) | Windows | Mac (10.9) | Linux (Ubuntu 14.04) |
| `"AltLeft"` | `0x12 (18)` | `0x12 (18)` | `0x12 (18)` | `0x12 (18)` | `0x12 (18)` | `0x12 (18)` | `0x12 (18)` | `0x12 (18)` |
| `"AltRight"` | `0x12 (18)` | `0x12 (18)` | `0x12 (18)` | `0x12 (18)` | `0x12 (18)` | `0x12 (18)` | `0x12 (18)` | `0x12 (18)` |
| `"AltRight"` when it's `"AltGraph"` key | [1] | [1] | ❌N/A | `0xE1 (225)`⚠️ | ❌ N/A | [1] | ❌ N/A | `0xE1 (225)`⚠️ |
| `"CapsLock"` | `0x14 (20)` [2] | `0x14 (20)` [2] | `0x14 (20)` | `0x14 (20)` | `0x14 (20)` | `0x14 (20)` [2] | `0x14 (20)` | `0x14 (20)` [3] |
| `"ControlLeft"` | `0x11 (17)` | `0x11 (17)` | `0x11 (17)` | `0x11 (17)` | `0x11 (17)` | `0x11 (17)` | `0x11 (17)` | `0x11 (17)` |
| `"ControlRight"` | `0x11 (17)` | `0x11 (17)` | `0x11 (17)` | `0x11 (17)` | `0x11 (17)` | `0x11 (17)` | `0x11 (17)` | `0x11 (17)` |
| `"MetaLeft"` | `0x5B (91)` | `0x5B (91)` | `0x5B (91)` | `0x5B (91)` | `0x5B (91)` | `0x5B (91)` | `0xE0 (224)`⚠️ | `0x5B (91)` |
| `"MetaRight"` | `0x5C (92)` | `0x5C (92)` | `0x5D (93)`⚠️ | `0x5C (92)` | `0x5D (93)`⚠️ | `0x5B (91)`⚠️ | `0xE0 (224)`⚠️ | `0x5B (91)`⚠️ |
| `"ShiftLeft"` | `0x10 (16)` | `0x10 (16)` | `0x10 (16)` | `0x10 (16)` | `0x10 (16)` | `0x10 (16)` | `0x10 (16)` | `0x10 (16)` |
| `"ShiftRight"` | `0x10 (16)` | `0x10 (16)` | `0x10 (16)` | `0x10 (16)` | `0x10 (16)` | `0x10 (16)` | `0x10 (16)` | `0x10 (16)` |
| `KeyboardEvent.code` | Windows | Windows | Mac (10.9) | Linux (Ubuntu 14.04) | Mac (10.9) | Windows | Mac (10.9) | Linux (Ubuntu 14.04) |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| IE 11 | Google Chrome 34 | Chromium 34 | Safari 7 | Gecko 29 |

[1] On Windows, pressing the `AltGraph` key raises both the `"ControlLeft"` and the `"AltRight"` key events.

[2] When the Japanese keyboard layout is active, pressing the `CapsLock` key without pressing `Shift` raises `0xF0 (240)`. The key works as the `Alphanumeric` key whose label is `"英数"`.

[3] When the Japanese keyboard layout is active, pressing the `"CapsLock"` key without pressing `Shift` raises `0x00 (0)`. The key works as the `"Alphanumeric"` key whose label is `"英数"`.

keyCode values of each browser's keydown event caused by non-printable keys:| `KeyboardEvent.code` | IE 11 | Google Chrome 34 | Chromium 34 | Safari 7 | Gecko 29 |
| --- | --- | --- | --- | --- | --- |
| Windows | Windows | Mac (10.9) | Linux (Ubuntu 14.04) | Mac (10.9) | Windows | Mac (10.9) | Linux (Ubuntu 14.04) |
| `"ContextMenu"` | `0x5D (93)` | `0x5D (93)` | `0x00 (0)`⚠️ [1] | `0x5D (93)` | `0x00 (0)`⚠️ [1] | `0x5D (93)` | `0x5D (93)` | `0x5D (93)` |
| `"Enter"` | `0x0D (13)` | `0x0D (13)` | `0x0D (13)` | `0x0D (13)` | `0x0D (13)` | `0x0D (13)` | `0x0D (13)` | `0x0D (13)` |
| `"Space"` | `0x20 (32)` | `0x20 (32)` | `0x20 (32)` | `0x20 (32)` | `0x20 (32)` | `0x20 (32)` | `0x20 (32)` | `0x20 (32)` |
| `"Tab"` | `0x09 (9)` | `0x09 (9)` | `0x09 (9)` | `0x09 (9)` | `0x09 (9)` | `0x09 (9)` | `0x09 (9)` | `0x09 (9)` |
| `"Delete"` | `0x2E (46)` | `0x2E (46)` | `0x2E (46)` | `0x2E (46)` | `0x2E (46)` | `0x2E (46)` | `0x2E (46)` | `0x2E (46)` |
| `"End"` | `0x23 (35)` | `0x23 (35)` | `0x23 (35)` | `0x23 (35)` | `0x23 (35)` | `0x23 (35)` | `0x23 (35)` | `0x23 (35)` |
| `"Help"` | ❌ N/A | ❌ N/A | `0x2D (45)`⚠️ [2] | `0x2F (47)`⚠️ [3] | `0x2D (45)`⚠️ [2] | ❌ N/A | `0x2D (45)`⚠️ [2] | `0x06 (6)`⚠️ [3] |
| `"Home"` | `0x24 (36)` | `0x24 (36)` | `0x24 (36)` | `0x24 (36)` | `0x24 (36)` | `0x24 (36)` | `0x24 (36)` | `0x24 (36)` |
| `"Insert"` | `0x2D (45)` | `0x2D (45)` | `0x2D (45)` | `0x2D (45)` | `0x2D (45)` | `0x2D (45)` | `0x2D (45)` | `0x2D (45)` |
| `"PageDown"` | `0x22 (34)` | `0x22 (34)` | `0x22 (34)` | `0x22 (34)` | `0x22 (34)` | `0x22 (34)` | `0x22 (34)` | `0x22 (34)` |
| `"PageUp"` | `0x21 (33)` | `0x21 (33)` | `0x21 (33)` | `0x21 (33)` | `0x21 (33)` | `0x21 (33)` | `0x21 (33)` | `0x21 (33)` |
| `"ArrowDown"` | `0x28 (40)` | `0x28 (40)` | `0x28 (40)` | `0x28 (40)` | `0x28 (40)` | `0x28 (40)` | `0x28 (40)` | `0x28 (40)` |
| `"ArrowLeft"` | `0x25 (37)` | `0x25 (37)` | `0x25 (37)` | `0x25 (37)` | `0x25 (37)` | `0x25 (37)` | `0x25 (37)` | `0x25 (37)` |
| `"ArrowRight"` | `0x27 (39)` | `0x27 (39)` | `0x27 (39)` | `0x27 (39)` | `0x27 (39)` | `0x27 (39)` | `0x27 (39)` | `0x27 (39)` |
| `"ArrowUp"` | `0x26 (38)` | `0x26 (38)` | `0x26 (38)` | `0x26 (38)` | `0x26 (38)` | `0x26 (38)` | `0x26 (38)` | `0x26 (38)` |
| `"Escape"` | `0x1B (27)` | `0x1B (27)` | `0x1B (27)` | `0x1B (27)` | `0x1B (27)` | `0x1B (27)` | `0x1B (27)` | `0x1B (27)` |
| `"PrintScreen"` | `0x2C (44)` [4] | `0x2C (44)` [4] | `0x7C (124)`⚠️ [5] | `0x2A (42)`⚠️ | `0x7C (124)`⚠️ [5] | `0x2C (44)` [4] | `0x2C (44)` | `0x2A (42)`⚠️ |
| `"ScrollLock"` | `0x91 (145)` | `0x91 (145)` | `0x7D (125)`⚠️ [5] | `0x91 (145)` | `0x7D (125)`⚠️ [5] | `0x91 (145)` | `0x91 (145)` | `0x91 (145)` |
| `"Pause"` | `0x13 (19)` [6] | `0x13 (19)` [6] | `0x7E (126)`⚠️ [5] | `0x13 (19)` | `0x7E (126)`⚠️ [5] | `0x13 (19)` [6] | `0x13 (19)` | `0x13 (19)` |
| `KeyboardEvent.code` | Windows | Windows | Mac (10.9) | Linux (Ubuntu 14.04) | Mac (10.9) | Windows | Mac (10.9) | Linux (Ubuntu 14.04) |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| IE 11 | Google Chrome 34 | Chromium 34 | Safari 7 | Gecko 29 |

[1] A `keypress` event is fired and its `keyCode` and `charCode` are `0x10 (16)` but the text isn't actually entered into the editor.

[2] On Mac, the `Help` key is mapped to the `Insert` key of PC keyboards. These `keyCode` values are the same as the `Insert` key's `keyCode` values.

[3] Tested on Fedora 20.

[4] Only a `keyup` event is fired.

[5] PC's `PrintScreen`, `ScrollLock` and `Pause` are mapped to Mac's `F13`, `F14` and `F15`, respectively. Chrome and Safari map them to the same `keyCode` values as Mac's keys.

[6] `Pause` key with `Control` generates `0x03 (3)`.

keyCode values of each browser's keydown event caused by function keys:| `KeyboardEvent.code` | IE 11 | Google Chrome 34 | Chromium 34 | Safari 7 | Gecko 29 |
| --- | --- | --- | --- | --- | --- |
| Windows | Windows | Mac (10.9) | Linux (Ubuntu 14.04) | Mac (10.9) | Windows | Mac (10.9) | Linux (Ubuntu 14.04) |
| `"F1"` | `0x70 (112)` | `0x70 (112)` | `0x70 (112)` | `0x70 (112)` | `0x70 (112)` | `0x70 (112)` | `0x70 (112)` | `0x70 (112)` |
| `"F2"` | `0x71 (113)` | `0x71 (113)` | `0x71 (113)` | `0x71 (113)` | `0x71 (113)` | `0x71 (113)` | `0x71 (113)` | `0x71 (113)` |
| `"F3"` | `0x72 (114)` | `0x72 (114)` | `0x72 (114)` | `0x72 (114)` | `0x72 (114)` | `0x72 (114)` | `0x72 (114)` | `0x72 (114)` |
| `"F4"` | `0x73 (115)` | `0x73 (115)` | `0x73 (115)` | `0x73 (115)` | `0x73 (115)` | `0x73 (115)` | `0x73 (115)` | `0x73 (115)` |
| `"F5"` | `0x74 (116)` | `0x74 (116)` | `0x74 (116)` | `0x74 (116)` | `0x74 (116)` | `0x74 (116)` | `0x74 (116)` | `0x74 (116)` |
| `"F6"` | `0x75 (117)` | `0x75 (117)` | `0x75 (117)` | `0x75 (117)` | `0x75 (117)` | `0x75 (117)` | `0x75 (117)` | `0x75 (117)` |
| `"F7"` | `0x76 (118)` | `0x76 (118)` | `0x76 (118)` | `0x76 (118)` | `0x76 (118)` | `0x76 (118)` | `0x76 (118)` | `0x76 (118)` |
| `"F8"` | `0x77 (119)` | `0x77 (119)` | `0x77 (119)` | `0x77 (119)` | `0x77 (119)` | `0x77 (119)` | `0x77 (119)` | `0x77 (119)` |
| `"F9"` | `0x78 (120)` | `0x78 (120)` | `0x78 (120)` | `0x78 (120)` | `0x78 (120)` | `0x78 (120)` | `0x78 (120)` | `0x78 (120)` |
| `"F10"` | `0x79 (121)` | `0x79 (121)` | `0x79 (121)` | `0x79 (121)` | `0x79 (121)` | `0x79 (121)` | `0x79 (121)` | `0x79 (121)` |
| `"F11"` | `0x7A (122)` | `0x7A (122)` | `0x7A (122)` | `0x7A (122)` | `0x7A (122)` | `0x7A (122)` | `0x7A (122)` | `0x7A (122)` |
| `"F12"` | `0x7B (123)` | `0x7B (123)` | `0x7B (123)` | `0x7B (123)` | `0x7B (123)` | `0x7B (123)` | `0x7B (123)` | `0x7B (123)` |
| `"F13"` | `0x7C (124)` | `0x7C (124)` | `0x7C (124)` | `0x7C (124)` [1] | `0x7C (124)` | `0x7C (124)` | `0x2C (44)` ⚠️ [2] | `0x00 (0)`⚠️ [3] |
| `"F14"` | `0x7D (125)` | `0x7D (125)` | `0x7D (125)` | `0x7D (125)` [1] | `0x7D (125)` | `0x7D (125)` | `0x91 (145)` ⚠️ [2] | `0x00 (0)`⚠️ [3] |
| `"F15"` | `0x7E (126)` | `0x7E (126)` | `0x7E (126)` | `0x7E (126)` [1] | `0x7E (126)` | `0x7E (126)` | `0x13 (19)` ⚠️ [2] | `0x00 (0)`⚠️ [3] |
| `"F16"` | `0x7F (127)` | `0x7F (127)` | `0x7F (127)` | `0x7F (127)` [1] | `0x7F (127)` | `0x7F (127)` | `0x7F (127)` | `0x00 (0)`⚠️ [3] |
| `"F17"` | `0x80 (128)` | `0x80 (128)` | `0x80 (128)` | `0x80 (128)` [1] | `0x80 (128)` | `0x80 (128)` | `0x80 (128)` | `0x00 (0)`⚠️ [3] |
| `"F18"` | `0x81 (129)` | `0x81 (129)` | `0x81 (129)` | `0x81 (129)` [1] | `0x81 (129)` | `0x81 (129)` | `0x81 (129)` | `0x00 (0)`⚠️ [3] |
| `"F19"` | `0x82 (130)` | `0x82 (130)` | `0x82 (130)` | ❌ `N/A` [4] | `0x82 (130)` | `0x82 (130)` | `0x82 (130)` | `0x00 (0)`⚠️ [3] |
| `"F20"` | `0x83 (131)` | `0x83 (131)` | `0x83 (131)` | ❌ `N/A` [4] | `0xE5 (229)`⚠️ [5] | `0x83 (131)` | `0x00 (0)`⚠️ | ❌ `N/A` [6] |
| `"F21"` | `0x84 (132)` | `0x84 (132)` | `0x00 (0)`⚠️ [7] | ❌ `N/A` [4] | `0x00 (0)`⚠️ [7] | `0x84 (132)` | ❌ `N/A` [8] | ❌ `N/A` [6] |
| `"F22"` | `0x85 (133)` | `0x85 (133)` | `0x00 (0)`⚠️ [7] | ❌ `N/A` [4] | `0x00 (0)`⚠️ [7] | `0x85 (133)` | ❌ `N/A` [8] | ❌ `N/A` [6] |
| `"F23"` | `0x86 (134)` | `0x86 (134)` | `0x00 (0)`⚠️ [7] | ❌ `N/A` [4] | `0x00 (0)`⚠️ [7] | `0x86 (134)` | ❌ `N/A` [8] | ❌ `N/A` [6] |
| `"F24"` | `0x87 (135)` | `0x87 (135)` | `0x00 (0)`⚠️ [7] | ❌ `N/A` [4] | `0x00 (0)`⚠️ [7] | `0x87 (135)` | ❌ `N/A` [8] | `0x00 (0)`⚠️ [3] |
| `KeyboardEvent.code` | Windows | Windows | Mac (10.9) | Linux (Ubuntu 14.04) | Mac (10.9) | Windows | Mac (10.9) | Linux (Ubuntu 14.04) |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| IE 11 | Google Chrome 34 | Chromium 34 | Safari 7 | Gecko 29 |

[1] Tested on Fedora 20.

[2] On PCs, `PrintScreen`, `ScrollLock` and `Pause` are mapped to the Mac's `F13`, `F14` and `F15`, respectively. Firefox sets for them the same `keyCode` values as the PC's keys.

[3] Tested on Fedora 20. The keys don't cause `GDK_Fxx` keysyms. If the keys cause proper keysyms, these values must be same as IE.

[4] Tested on Fedora 20. The keys don't cause DOM key events on Chromium.

[5] The `keyCode` value of a `keyUp` event is `0x83 (131)`.

[6] Tested on Fedora 20. The keys don't cause DOM key events on Firefox.

[7] Only the `keydown` event is fired.

[8] No DOM key events are fired on Firefox.

### Numpad keys

 keyCode values of each browser's keydown event caused by keys in numpad in
 NumLock state
 | `KeyboardEvent.code` | IE 11 | Google Chrome 34 | Chromium 34 | Safari 7 | Gecko 29 |
| --- | --- | --- | --- | --- | --- |
| Windows | Windows | Mac (10.9) | Linux (Ubuntu 14.04) | Mac (10.9) | Windows | Mac (10.9) | Linux (Ubuntu 14.04) |
| `"NumLock"` | `0x90 (144)` | `0x90 (144)` | `0x0C (12)`⚠️ [1] | `0x90 (144)` | `0x0C (12)`⚠️ [1] | `0x90 (144)` | `0x0C (12)`⚠️ [1] | `0x90 (144)` |
| `"Numpad0"` | `0x60 (96)` | `0x60 (96)` | `0x60 (96)` | `0x60 (96)` | `0x60 (96)` | `0x60 (96)` | `0x60 (96)` | `0x60 (96)` |
| `"Numpad1"` | `0x61 (97)` | `0x61 (97)` | `0x61 (97)` | `0x61 (97)` | `0x61 (97)` | `0x61 (97)` | `0x61 (97)` | `0x61 (97)` |
| `"Numpad2"` | `0x62 (98)` | `0x62 (98)` | `0x62 (98)` | `0x62 (98)` | `0x62 (98)` | `0x62 (98)` | `0x62 (98)` | `0x62 (98)` |
| `"Numpad3"` | `0x63 (99)` | `0x63 (99)` | `0x63 (99)` | `0x63 (99)` | `0x63 (99)` | `0x63 (99)` | `0x63 (99)` | `0x63 (99)` |
| `"Numpad4"` | `0x64 (100)` | `0x64 (100)` | `0x64 (100)` | `0x64 (100)` | `0x64 (100)` | `0x64 (100)` | `0x64 (100)` | `0x64 (100)` |
| `"Numpad5"` | `0x65 (101)` | `0x65 (101)` | `0x65 (101)` | `0x65 (101)` | `0x65 (101)` | `0x65 (101)` | `0x65 (101)` | `0x65 (101)` |
| `"Numpad6"` | `0x66 (102)` | `0x66 (102)` | `0x66 (102)` | `0x66 (102)` | `0x66 (102)` | `0x66 (102)` | `0x66 (102)` | `0x66 (102)` |
| `"Numpad7"` | `0x67 (103)` | `0x67 (103)` | `0x67 (103)` | `0x67 (103)` | `0x67 (103)` | `0x67 (103)` | `0x67 (103)` | `0x67 (103)` |
| `"Numpad8"` | `0x68 (104)` | `0x68 (104)` | `0x68 (104)` | `0x68 (104)` | `0x68 (104)` | `0x68 (104)` | `0x68 (104)` | `0x68 (104)` |
| `"Numpad9"` | `0x69 (105)` | `0x69 (105)` | `0x69 (105)` | `0x69 (105)` | `0x69 (105)` | `0x69 (105)` | `0x69 (105)` | `0x69 (105)` |
| `"NumpadAdd"` | `0x6B (107)` | `0x6B (107)` | `0x6B (107)` | `0x6B (107)` | `0x6B (107)` | `0x6B (107)` | `0x6B (107)` | `0x6B (107)` |
| `"NumpadComma"` inputting `","` | `0xC2 (194)` | `0xC2 (194)` | `0xBC (188)`⚠️ | ❌ *Always inputs* `"."` | `0xBC (188)`⚠️ | `0xC2 (194)` | `0x6C (108)`⚠️ | ❌ *Always inputs* `"."` |
| `"NumpadComma"` inputting `"."` or empty string | `0xC2 (194)` | `0xC2 (194)` | `0xBE (190)`⚠️ | `0x6E (110)`⚠️ | `0xBE (190)`⚠️ | `0xC2 (194)` | `0x6C (108)`⚠️ | `0x6E (110)`⚠️ |
| `"NumpadDecimal"` inputting `"."` | `0x6E (110)` | `0x6E (110)` | `0x6E (110)` | `0x6E (110)` | `0x6E (110)` | `0x6E (110)` | `0x6E (110)` | `0x6E (110)` |
| `"NumpadDecimal"` inputting `","` | `0x6E (110)` | `0x6E (110)` | `0x6E (110)` | `0x6C (108)`⚠️ | `0x6E (110)` | `0x6E (110)` | `0x6E (110)` | `0x6C (108)`⚠️ |
| `"NumpadDivide"` | `0x6F (111)` | `0x6F (111)` | `0x6F (111)` | `0x6F (111)` | `0x6F (111)` | `0x6F (111)` | `0x6F (111)` | `0x6F (111)` |
| `"NumpadEnter"` | `0x0D (13)` | `0x0D (13)` | `0x0D (13)` | `0x0D (13)` | `0x0D (13)` | `0x0D (13)` | `0x0D (13)` | `0x0D (13)` |
| `"NumpadEqual"` | `0x0C (12)` | `0x0C (12)` | `0xBB (187)`⚠️ | `0xBB (187)`⚠️ | `0xBB (187)`⚠️ | `0x0C (12)` | `0x3D (61)`⚠️ | `0x3D (61)`⚠️ |
| `"NumpadMultiply"` | `0x6A (106)` | `0x6A (106)` | `0x6A (106)` | `0x6A (106)` | `0x6A (106)` | `0x6A (106)` | `0x6A (106)` | `0x6A (106)` |
| `"NumpadSubtract"` | `0x6D (109)` | `0x6D (109)` | `0x6D (109)` | `0x6D (109)` | `0x6D (109)` | `0x6D (109)` | `0x6D (109)` | `0x6D (109)` |
| `KeyboardEvent.code` | Windows | Windows | Mac (10.9) | Linux (Ubuntu 14.04) | Mac (10.9) | Windows | Mac (10.9) | Linux (Ubuntu 14.04) |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| IE 11 | Google Chrome 34 | Chromium 34 | Safari 7 | Gecko 29 |

[1] `"NumLock"` key works as `"Clear"` key on Mac.


 keyCode values of each browser's keydown event caused by keys in numpad
 without NumLock state
 | `KeyboardEvent.code` | IE 11 | Google Chrome 34 | Chromium 34 | Gecko 29 |
| --- | --- | --- | --- | --- |
| Windows | Windows | Linux (Ubuntu 14.04) | Windows | Linux (Ubuntu 14.04) |
| `"Numpad0"` (`"Insert"`) | `0x2D (45)` | `0x2D (45)` | `0x2D (45)` | `0x2D (45)` | `0x2D (45)` |
| `"Numpad1"` (`"End"`) | `0x23 (35)` | `0x23 (35)` | `0x23 (35)` | `0x23 (35)` | `0x23 (35)` |
| `"Numpad2"` (`"ArrowDown"`) | `0x28 (40)` | `0x28 (40)` | `0x28 (40)` | `0x28 (40)` | `0x28 (40)` |
| `"Numpad3"` (`"PageDown"`) | `0x22 (34)` | `0x22 (34)` | `0x22 (34)` | `0x22 (34)` | `0x22 (34)` |
| `"Numpad4"` (`"ArrowLeft"`) | `0x25 (37)` | `0x25 (37)` | `0x25 (37)` | `0x25 (37)` | `0x25 (37)` |
| `"Numpad5"` | `0x0C (12)` | `0x0C (12)` | `0x0C (12)` | `0x0C (12)` | `0x0C (12)` |
| `"Numpad6"` (`"ArrowRight"`) | `0x27 (39)` | `0x27 (39)` | `0x27 (39)` | `0x27 (39)` | `0x27 (39)` |
| `"Numpad7"` (`"Home"`) | `0x24 (36)` | `0x24 (36)` | `0x24 (36)` | `0x24 (36)` | `0x24 (36)` |
| `"Numpad8"` (`"ArrowUp"`) | `0x26 (38)` | `0x26 (38)` | `0x26 (38)` | `0x26 (38)` | `0x26 (38)` |
| `"Numpad9"` (`"PageUp"`) | `0x21 (33)` | `0x21 (33)` | `0x21 (33)` | `0x21 (33)` | `0x21 (33)` |
| `"NumpadDecimal"` (`"Delete"`) | `0x2E (46)` | `0x2E (46)` | `0x2E (46)` | `0x2E (46)` | `0x2E (46)` |
| `KeyboardEvent.code` | Windows | Windows | Linux (Ubuntu 14.04) | Windows | Linux (Ubuntu 14.04) |
| --- | --- | --- | --- | --- | --- |
| IE 11 | Google Chrome 34 | Chromium 34 | Gecko 29 |

**Note:** Recent Mac doesn't have a `NumLock` key, and therefore state. That's why the unlocked state is not available.

Constants for keyCode value
---------------------------

Gecko defines a lot of `keyCode` values in `KeyboardEvent` for making the mapping table explicitly. These values are useful for add-on developers of Firefox, but not so useful in public web pages.

| Constant | Value | Description |
| --- | --- | --- |
| `DOM_VK_CANCEL` | 0x03 (3) | Cancel key. |
| `DOM_VK_HELP` | 0x06 (6) | Help key. |
| `DOM_VK_BACK_SPACE` | 0x08 (8) | Backspace key. |
| `DOM_VK_TAB` | 0x09 (9) | Tab key. |
| `DOM_VK_CLEAR` | 0x0C (12) | 
 "5" key on Numpad when NumLock is unlocked. Or on Mac, clear key which
 is positioned at NumLock key.
  |
| `DOM_VK_RETURN` | 0x0D (13) | Return/enter key on the main keyboard. |
| `DOM_VK_ENTER` | 0x0E (14) | 
 Reserved, but not used. 
Deprecated
 (Dropped, see
 [Firefox bug 969247](https://bugzil.la/969247).)
  |
| `DOM_VK_SHIFT` | 0x10 (16) | Shift key. |
| `DOM_VK_CONTROL` | 0x11 (17) | Control key. |
| `DOM_VK_ALT` | 0x12 (18) | Alt (Option on Mac) key. |
| `DOM_VK_PAUSE` | 0x13 (19) | Pause key. |
| `DOM_VK_CAPS_LOCK` | 0x14 (20) | Caps lock. |
| `DOM_VK_KANA` | 0x15 (21) | Linux support for this keycode was added in Gecko 4.0. |
| `DOM_VK_HANGUL` | 0x15 (21) | Linux support for this keycode was added in Gecko 4.0. |
| `DOM_VK_EISU` | 0x 16 (22) | "英数" key on Japanese Mac keyboard. |
| `DOM_VK_JUNJA` | 0x17 (23) | Linux support for this keycode was added in Gecko 4.0. |
| `DOM_VK_FINAL` | 0x18 (24) | Linux support for this keycode was added in Gecko 4.0. |
| `DOM_VK_HANJA` | 0x19 (25) | Linux support for this keycode was added in Gecko 4.0. |
| `DOM_VK_KANJI` | 0x19 (25) | Linux support for this keycode was added in Gecko 4.0. |
| `DOM_VK_ESCAPE` | 0x1B (27) | Escape key. |
| `DOM_VK_CONVERT` | 0x1C (28) | Linux support for this keycode was added in Gecko 4.0. |
| `DOM_VK_NONCONVERT` | 0x1D (29) | Linux support for this keycode was added in Gecko 4.0. |
| `DOM_VK_ACCEPT` | 0x1E (30) | Linux support for this keycode was added in Gecko 4.0. |
| `DOM_VK_MODECHANGE` | 0x1F (31) | Linux support for this keycode was added in Gecko 4.0. |
| `DOM_VK_SPACE` | 0x20 (32) | Space bar. |
| `DOM_VK_PAGE_UP` | 0x21 (33) | Page Up key. |
| `DOM_VK_PAGE_DOWN` | 0x22 (34) | Page Down key. |
| `DOM_VK_END` | 0x23 (35) | End key. |
| `DOM_VK_HOME` | 0x24 (36) | Home key. |
| `DOM_VK_LEFT` | 0x25 (37) | Left arrow. |
| `DOM_VK_UP` | 0x26 (38) | Up arrow. |
| `DOM_VK_RIGHT` | 0x27 (39) | Right arrow. |
| `DOM_VK_DOWN` | 0x28 (40) | Down arrow. |
| `DOM_VK_SELECT` | 0x29 (41) | Linux support for this keycode was added in Gecko 4.0. |
| `DOM_VK_PRINT` | 0x2A (42) | Linux support for this keycode was added in Gecko 4.0. |
| `DOM_VK_EXECUTE` | 0x2B (43) | Linux support for this keycode was added in Gecko 4.0. |
| `DOM_VK_PRINTSCREEN` | 0x2C (44) | Print Screen key. |
| `DOM_VK_INSERT` | 0x2D (45) | Ins(ert) key. |
| `DOM_VK_DELETE` | 0x2E (46) | Del(ete) key. |
| `DOM_VK_0` | 0x30 (48) | "0" key in standard key location. |
| `DOM_VK_1` | 0x31 (49) | "1" key in standard key location. |
| `DOM_VK_2` | 0x32 (50) | "2" key in standard key location. |
| `DOM_VK_3` | 0x33 (51) | "3" key in standard key location. |
| `DOM_VK_4` | 0x34 (52) | "4" key in standard key location. |
| `DOM_VK_5` | 0x35 (53) | "5" key in standard key location. |
| `DOM_VK_6` | 0x36 (54) | "6" key in standard key location. |
| `DOM_VK_7` | 0x37 (55) | "7" key in standard key location. |
| `DOM_VK_8` | 0x38 (56) | "8" key in standard key location. |
| `DOM_VK_9` | 0x39 (57) | "9" key in standard key location. |
| `DOM_VK_COLON` | 0x3A (58) | Colon (":") key. |
| `DOM_VK_SEMICOLON` | 0x3B (59) | Semicolon (";") key. |
| `DOM_VK_LESS_THAN` | 0x3C (60) | Less-than ("<") key. |
| `DOM_VK_EQUALS` | 0x3D (61) | Equals ("=") key. |
| `DOM_VK_GREATER_THAN` | 0x3E (62) | Greater-than (">") key. |
| `DOM_VK_QUESTION_MARK` | 0x3F (63) | Question mark ("?") key. |
| `DOM_VK_AT` | 0x40 (64) | Atmark ("@") key. |
| `DOM_VK_A` | 0x41 (65) | "A" key. |
| `DOM_VK_B` | 0x42 (66) | "B" key. |
| `DOM_VK_C` | 0x43 (67) | "C" key. |
| `DOM_VK_D` | 0x44 (68) | "D" key. |
| `DOM_VK_E` | 0x45 (69) | "E" key. |
| `DOM_VK_F` | 0x46 (70) | "F" key. |
| `DOM_VK_G` | 0x47 (71) | "G" key. |
| `DOM_VK_H` | 0x48 (72) | "H" key. |
| `DOM_VK_I` | 0x49 (73) | "I" key. |
| `DOM_VK_J` | 0x4A (74) | "J" key. |
| `DOM_VK_K` | 0x4B (75) | "K" key. |
| `DOM_VK_L` | 0x4C (76) | "L" key. |
| `DOM_VK_M` | 0x4D (77) | "M" key. |
| `DOM_VK_N` | 0x4E (78) | "N" key. |
| `DOM_VK_O` | 0x4F (79) | "O" key. |
| `DOM_VK_P` | 0x50 (80) | "P" key. |
| `DOM_VK_Q` | 0x51 (81) | "Q" key. |
| `DOM_VK_R` | 0x52 (82) | "R" key. |
| `DOM_VK_S` | 0x53 (83) | "S" key. |
| `DOM_VK_T` | 0x54 (84) | "T" key. |
| `DOM_VK_U` | 0x55 (85) | "U" key. |
| `DOM_VK_V` | 0x56 (86) | "V" key. |
| `DOM_VK_W` | 0x57 (87) | "W" key. |
| `DOM_VK_X` | 0x58 (88) | "X" key. |
| `DOM_VK_Y` | 0x59 (89) | "Y" key. |
| `DOM_VK_Z` | 0x5A (90) | "Z" key. |
| `DOM_VK_WIN` | 0x5B (91) | Windows logo key on Windows. Or Super or Hyper key on Linux. |
| `DOM_VK_CONTEXT_MENU` | 0x5D (93) | Opening context menu key. |
| `DOM_VK_SLEEP` | 0x5F (95) | Linux support for this keycode was added in Gecko 4.0. |
| `DOM_VK_NUMPAD0` | 0x60 (96) | "0" on the numeric keypad. |
| `DOM_VK_NUMPAD1` | 0x61 (97) | "1" on the numeric keypad. |
| `DOM_VK_NUMPAD2` | 0x62 (98) | "2" on the numeric keypad. |
| `DOM_VK_NUMPAD3` | 0x63 (99) | "3" on the numeric keypad. |
| `DOM_VK_NUMPAD4` | 0x64 (100) | "4" on the numeric keypad. |
| `DOM_VK_NUMPAD5` | 0x65 (101) | "5" on the numeric keypad. |
| `DOM_VK_NUMPAD6` | 0x66 (102) | "6" on the numeric keypad. |
| `DOM_VK_NUMPAD7` | 0x67 (103) | "7" on the numeric keypad. |
| `DOM_VK_NUMPAD8` | 0x68 (104) | "8" on the numeric keypad. |
| `DOM_VK_NUMPAD9` | 0x69 (105) | "9" on the numeric keypad. |
| `DOM_VK_MULTIPLY` | 0x6A (106) | "\*" on the numeric keypad. |
| `DOM_VK_ADD` | 0x6B (107) | "+" on the numeric keypad. |
| `DOM_VK_SEPARATOR` | 0x6C (108) |  |
| `DOM_VK_SUBTRACT` | 0x6D (109) | "-" on the numeric keypad. |
| `DOM_VK_DECIMAL` | 0x6E (110) | Decimal point on the numeric keypad. |
| `DOM_VK_DIVIDE` | 0x6F (111) | "/" on the numeric keypad. |
| `DOM_VK_F1` | 0x70 (112) | F1 key. |
| `DOM_VK_F2` | 0x71 (113) | F2 key. |
| `DOM_VK_F3` | 0x72 (114) | F3 key. |
| `DOM_VK_F4` | 0x73 (115) | F4 key. |
| `DOM_VK_F5` | 0x74 (116) | F5 key. |
| `DOM_VK_F6` | 0x75 (117) | F6 key. |
| `DOM_VK_F7` | 0x76 (118) | F7 key. |
| `DOM_VK_F8` | 0x77 (119) | F8 key. |
| `DOM_VK_F9` | 0x78 (120) | F9 key. |
| `DOM_VK_F10` | 0x79 (121) | F10 key. |
| `DOM_VK_F11` | 0x7A (122) | F11 key. |
| `DOM_VK_F12` | 0x7B (123) | F12 key. |
| `DOM_VK_F13` | 0x7C (124) | F13 key. |
| `DOM_VK_F14` | 0x7D (125) | F14 key. |
| `DOM_VK_F15` | 0x7E (126) | F15 key. |
| `DOM_VK_F16` | 0x7F (127) | F16 key. |
| `DOM_VK_F17` | 0x80 (128) | F17 key. |
| `DOM_VK_F18` | 0x81 (129) | F18 key. |
| `DOM_VK_F19` | 0x82 (130) | F19 key. |
| `DOM_VK_F20` | 0x83 (131) | F20 key. |
| `DOM_VK_F21` | 0x84 (132) | F21 key. |
| `DOM_VK_F22` | 0x85 (133) | F22 key. |
| `DOM_VK_F23` | 0x86 (134) | F23 key. |
| `DOM_VK_F24` | 0x87 (135) | F24 key. |
| `DOM_VK_NUM_LOCK` | 0x90 (144) | Num Lock key. |
| `DOM_VK_SCROLL_LOCK` | 0x91 (145) | Scroll Lock key. |
| `DOM_VK_WIN_OEM_FJ_JISHO` | 0x92 (146) | 
 An
 OEM specific key on Windows.
 This was used for "Dictionary" key on Fujitsu OASYS.
  |
| `DOM_VK_WIN_OEM_FJ_MASSHOU` | 0x93 (147) | 
 An
 OEM specific key on Windows.
 This was used for "Unregister word" key on Fujitsu OASYS.
  |
| `DOM_VK_WIN_OEM_FJ_TOUROKU` | 0x94 (148) | 
 An
 OEM specific key on Windows.
 This was used for "Register word" key on Fujitsu OASYS.
  |
| `DOM_VK_WIN_OEM_FJ_LOYA` | 0x95 (149) | 
 An
 OEM specific key on Windows.
 This was used for "Left OYAYUBI" key on Fujitsu OASYS.
  |
| `DOM_VK_WIN_OEM_FJ_ROYA` | 0x96 (150) | 
 An
 OEM specific key on Windows.
 This was used for "Right OYAYUBI" key on Fujitsu OASYS.
  |
| `DOM_VK_CIRCUMFLEX` | 0xA0 (160) | Circumflex ("^") key. |
| `DOM_VK_EXCLAMATION` | 0xA1 (161) | Exclamation ("!") key. |
| `DOM_VK_DOUBLE_QUOTE` | 0xA2 (162) | Double quote (""") key. |
| `DOM_VK_HASH` | 0xA3 (163) | Hash ("#") key. |
| `DOM_VK_DOLLAR` | 0xA4 (164) | Dollar sign ("$") key. |
| `DOM_VK_PERCENT` | 0xA5 (165) | Percent ("%") key. |
| `DOM_VK_AMPERSAND` | 0xA6 (166) | Ampersand ("&") key. |
| `DOM_VK_UNDERSCORE` | 0xA7 (167) | Underscore ("\_") key. |
| `DOM_VK_OPEN_PAREN` | 0xA8 (168) | Open parenthesis ("(") key. |
| `DOM_VK_CLOSE_PAREN` | 0xA9 (169) | Close parenthesis (")") key. |
| `DOM_VK_ASTERISK` | 0xAA (170) | Asterisk ("\*") key. |
| `DOM_VK_PLUS` | 0xAB (171) | Plus ("+") key. |
| `DOM_VK_PIPE` | 0xAC (172) | Pipe ("|") key. |
| `DOM_VK_HYPHEN_MINUS` | 0xAD (173) | Hyphen-US/docs/Minus ("-") key. |
| `DOM_VK_OPEN_CURLY_BRACKET` | 0xAE (174) | Open curly bracket ("{") key. |
| `DOM_VK_CLOSE_CURLY_BRACKET` | 0xAF (175) | Close curly bracket ("}") key. |
| `DOM_VK_TILDE` | 0xB0 (176) | Tilde ("~") key. |
| `DOM_VK_VOLUME_MUTE` | 0xB5 (181) | Audio mute key. |
| `DOM_VK_VOLUME_DOWN` | 0xB6 (182) | Audio volume down key |
| `DOM_VK_VOLUME_UP` | 0xB7 (183) | Audio volume up key |
| `DOM_VK_COMMA` | 0xBC (188) | Comma (",") key. |
| `DOM_VK_PERIOD` | 0xBE (190) | Period (".") key. |
| `DOM_VK_SLASH` | 0xBF (191) | Slash ("/") key. |
| `DOM_VK_BACK_QUOTE` | 0xC0 (192) | Back tick ("`") key. |
| `DOM_VK_OPEN_BRACKET` | 0xDB (219) | Open square bracket ("[") key. |
| `DOM_VK_BACK_SLASH` | 0xDC (220) | Back slash ("\") key. |
| `DOM_VK_CLOSE_BRACKET` | 0xDD (221) | Close square bracket ("]") key. |
| `DOM_VK_QUOTE` | 0xDE (222) | Quote (''') key. |
| `DOM_VK_META` | 0xE0 (224) | Meta key on Linux, Command key on Mac. |
| `DOM_VK_ALTGR` | 0xE1 (225) | AltGr key (Level 3 Shift key or Level 5 Shift key) on Linux. |
| `DOM_VK_WIN_ICO_HELP` | 0xE3 (227) | 
 An
 OEM specific key on Windows.
 This is (was?) used for Olivetti ICO keyboard.
  |
| `DOM_VK_WIN_ICO_00` | 0xE4 (228) | 
 An
 OEM specific key on Windows.
 This is (was?) used for Olivetti ICO keyboard.
  |
| `DOM_VK_WIN_ICO_CLEAR` | 0xE6 (230) | 
 An
 OEM specific key on Windows.
 This is (was?) used for Olivetti ICO keyboard.
  |
| `DOM_VK_WIN_OEM_RESET` | 0xE9 (233) | 
 An
 OEM specific key on Windows.
 This was used for Nokia/Ericsson's device.
  |
| `DOM_VK_WIN_OEM_JUMP` | 0xEA (234) | 
 An
 OEM specific key on Windows.
 This was used for Nokia/Ericsson's device.
  |
| `DOM_VK_WIN_OEM_PA1` | 0xEB (235) | 
 An
 OEM specific key on Windows.
 This was used for Nokia/Ericsson's device.
  |
| `DOM_VK_WIN_OEM_PA2` | 0xEC (236) | 
 An
 OEM specific key on Windows.
 This was used for Nokia/Ericsson's device.
  |
| `DOM_VK_WIN_OEM_PA3` | 0xED (237) | 
 An
 OEM specific key on Windows.
 This was used for Nokia/Ericsson's device.
  |
| `DOM_VK_WIN_OEM_WSCTRL` | 0xEE (238) | 
 An
 OEM specific key on Windows.
 This was used for Nokia/Ericsson's device.
  |
| `DOM_VK_WIN_OEM_CUSEL` | 0xEF (239) | 
 An
 OEM specific key on Windows.
 This was used for Nokia/Ericsson's device.
  |
| `DOM_VK_WIN_OEM_ATTN` | 0xF0 (240) | 
 An
 OEM specific key on Windows.
 This was used for Nokia/Ericsson's device.
  |
| `DOM_VK_WIN_OEM_FINISH` | 0xF1 (241) | 
 An
 OEM specific key on Windows.
 This was used for Nokia/Ericsson's device.
  |
| `DOM_VK_WIN_OEM_COPY` | 0xF2 (242) | 
 An
 OEM specific key on Windows.
 This was used for Nokia/Ericsson's device.
  |
| `DOM_VK_WIN_OEM_AUTO` | 0xF3 (243) | 
 An
 OEM specific key on Windows.
 This was used for Nokia/Ericsson's device.
  |
| `DOM_VK_WIN_OEM_ENLW` | 0xF4 (244) | 
 An
 OEM specific key on Windows.
 This was used for Nokia/Ericsson's device.
  |
| `DOM_VK_WIN_OEM_BACKTAB` | 0xF5 (245) | 
 An
 OEM specific key on Windows.
 This was used for Nokia/Ericsson's device.
  |
| `DOM_VK_ATTN` | 0xF6 (246) | Attn (Attention) key of IBM midrange computers, e.g., AS/400. |
| `DOM_VK_CRSEL` | 0xF7 (247) | CrSel (Cursor Selection) key of IBM 3270 keyboard layout. |
| `DOM_VK_EXSEL` | 0xF8 (248) | ExSel (Extend Selection) key of IBM 3270 keyboard layout. |
| `DOM_VK_EREOF` | 0xF9 (249) | Erase EOF key of IBM 3270 keyboard layout. |
| `DOM_VK_PLAY` | 0xFA (250) | Play key of IBM 3270 keyboard layout. |
| `DOM_VK_ZOOM` | 0xFB (251) | Zoom key. |
| `DOM_VK_PA1` | 0xFD (253) | PA1 key of IBM 3270 keyboard layout. |
| `DOM_VK_WIN_OEM_CLEAR` | 0xFE (254) | 
 Clear key, but we're not sure the meaning difference from
 `DOM_VK_CLEAR`.
  |

### OEM specific keys on Windows

On Windows, some values of virtual keycode are defined (reserved) for OEM specific key. They are available for special keys on non-standard keyboard. In other words, some values are used for different meaning by two or more vendors (or hardware).

Starting Gecko 21 (and older than 15), OEM specific key values are available on the keyCode attribute only on Windows. So they are not useful for usual web applications. They are useful only for intranet applications or in similar situations.

See "Manufacturer-specific Virtual-Key Codes (Windows CE 5.0)" in MSDN for the detail.