While implementations are recommended to use the most relevant
identifier for a key independently of the platform or keyboard
layout mappings, DOM applications should not make assumption on
the ability of keyboard devices to generate them. When using
keyboard events, "consider using numbers and function keys
(F4, F5, and so on) instead of letters in shortcut-key
combinations" ([DWW95])
given that most keyboard layouts will provide keys for those.

"U+0000", "U+0001", ...,
"U+FFFFFF" are Unicode based key identifiers ([Unicode]). When a key cannot be mapped to Unicode, a
specific identifier is used (see also Guidelines for defining key identifiers). In
any case, no assumption should be made between the sequence of
keyboard events and the text events. The following three examples
illustrate the concept of keyboard layout mappings and its
relation with keyboard events (following the Guidelines for defining key identifiers, the 'Q' key is mapped to the Latin Capital Letter Q
key).

The keystroke "U+0051" (Latin Capital Letter Q key)
will produce (on a PC/AT US keyboard using a US keyboard layout
mapping and without any modifier activated) the Unicode character
q (Latin Small Letter Q):

Note:
The order between the text event and keyboard events may differ
depending on the keyboard devices.

A.1.1 Modifier keys

Keyboard input uses modifier keys to change the normal behavior
of a key. Keys associated with modifiers generate, like other
keys, "keydown" and "keyup" events as shown in the example
below. Some modifiers are activated while the key is being
pressed down or maintained pressed such as "Alt",
"Control", "Shift",
"AltGraph", or "Meta". Others
modifiers are activated depending on their state such as
"CapsLock", "NumLock", or
"Scroll". Change in the state happens when the
modifier key is being pressed down. The
KeyboardEvent interface provides convenient
attributes for some common modifiers keys:
KeyboardEvent.ctrlKey,
KeyboardEvent.shiftKey,
KeyboardEvent.altKey,
KeyboardEvent.metaKey. Some operating systems
simulate the "AltGraph" modifier key with the
combination of the "Alt and "Control"
modifier keys. Implementations are encouraged to use the
"AltGraph" modifier key.

The following example describes a possible sequence of keys to
generate the Unicode character Q (Latin Capital Letter Q)
on a PC/AT US keyboard using a US mapping:

Preventing a keydown or keyup event with a modifier does affect
the subsequent

A.1.2 Dead keys

Keyboard input uses dead keys for the input of composed character
sequences. Unlike the handwriting sequence, in which users enter
the base character first, keyboard input requires to enter a
special state when a dead key is pressed and emit the
character(s) only when one of a limited number of "legal" base
character is entered.

The dead keys are represented in the key identifiers set using
combining diacritical marks. The sequence of keystrokes "U+0302"
(Combining Circumflex Accent key) and "U+0045" (Latin Capital
Letter E key) will likely produce (on a PC/AT french keyboard
using a french mapping and without any modifier activated) the
Unicode character ê (Latin Small Letter E With Circumflex),
as preferred by the Unicode Normalization Form
NFC:

A.1.3 Input Method Editors

Also known as
front end processor, an input method
editor (IME) is an application that performs the conversion
between keystrokes and ideographs or other characters, usually
by user-guided dictionary lookup.

This specification does not provide a representation of the
input method editor (IME) events, e.g. representing the input
context, i.e. the IME's functions are not represented in this
set. As an example, receiving a keydown for the "Accept" key
identifier does not necessarily imply that the text currently
selected in the IME is being accepted. It only indicates that a
keystroke happened, disconnected from the IME Accept
functionality. Depending on the device in use, the IME Accept
functionality can be obtain using the Accept key or the Return
key. Keyboard events cannot be used to determine the current
state of the input method editor.

Keyboard events correspond to the events generated by the input
device after the keyboard layout mapping but before the
processing of the input method editor.

The following example describes a possible sequence of keys to
generate the Unicode character 市 (Kanji character, part of
CJK Unified Ideographs) using Japanese input methods. This
example assumes that the input method editor is activated and in
the Japanese-Romaji input mode. The keys "Convert"
and "Accept" may be replaced by others depending on
the input device in use and the configuration of the IME,
e.g. it could be respectively "U+0020" (Space key) and "Enter".

A.1.4 Guidelines for defining key identifiers

The list of key identifiers contained in this appendix is not
exhaustive and input devices may have to define their own key
identifiers. Here is a algorithm to determine which key
identifier to use:

Determine a representation for the key by looking at the
keyboard layout mapping in use (and not the keyboard device
in use). This representation should be unique, as human
friendly as possible, platform independent, and
consistent. For example, on PC/AT US keyboards with a US
mapping, the 'Q' key is mapped to the key identifier
"U+0051" (Latin Capital Letter Q key), the '1/!' key is
mapped to the key identifier "U+0031" (Digit One key), the
key '`/~' is mapped to the key identifier "U+0060" (Grave
Accent key), and the 'Enter' key is mapped to the key
identifier "Enter".

Find an appropriate mapping in the Unicode character
set. There might not always be an appropriate and obvious
mapping: the Unicode set contains characters and symbols,
the key might generate different characters depending on the
operating system, ... In general, unless the representation
of the key can be mapped to a unique Unicode character, it
is better to create a new one.

If no appropriate mapping was found, create a key identifier
as human friendly as possible. The key identifier must not
contain white spaces. As an example, the Enter key is mapped
to the key identifier "Enter" and not to "U+000A" (Line
Feed), given that this key generates the character 00000A on
Unix operating systems and the characters 00000D and 00000A
on Windows operating systems.

A.2 Key identifiers set

Note:
The keycodes Multiply, Add,
Substract, Decimal,
Separator, Divide,
NumPad0, NumPad1,
NumPad2, NumPad3,
NumPad4, NumPad5,
NumPad6, NumPad7,
NumPad8, and NumPad9 are not part of
this set. Use KeyBoard.keyLocation to know if a key
originated from the numeric keypad.