Traducción en curso

La propiedad de solo lectura KeyboardEvent.key retorna el valor de la tecla presionada por el usuario while taking into considerations the state of modifier keys such as the shiftKey as well as the keyboard locale/layout. Its value is determined as follows:

See a full list of key values.

  • If the pressed key has a printed representation, the returned value is a non-empty Unicode character string containing the printable representation of the key.
  • If the pressed key is a control or special character, the returned value is one of the pre-defined key values.
  • If the KeyboardEvent represents the press of a dead key, the key value must be "Dead".
  • Some specialty keyboard keys (such as the extended keys for controlling media on multimedia keyboards) don't generate key codes on Windows; instead, they trigger WM_APPCOMMAND events. These events get mapped to DOM keyboard events, and are listed among the "Virtual key codes" for Windows, even though they aren't actually key codes.
  • If the key cannot be identified, the returned value is "Unidentified".

KeyboardEvent Sequence

KeyboardEvents are fired in a pre-determined sequence and understanding this will go a long way into understanding the key property value for a particular KeyboardEvent. For a given key press, the sequence of KeyboardEvents fired is as follows assuming that Event.preventDefault is not called:

  1. keydown event is first fired. If the key is held down further and the key produces a character key, then the event continues to be emitted in a platform implementation dependent interval and the KeyboardEvent.repeat read only property  is set to true.
  2. If the key produces a character key that would result in a character being inserted into possibly an <input>, <textarea> or an element with HTMLElement.contentEditable set to true, the beforeinput and input event types are fired in that order. Note that some other implementations may fire keypress event if supported. The events will be fired repeatedly while the key is held down.
  3. keyup event is fired once the key is released. This completes the process.

In sequence 1 & 3, the KeyboardEvent.key attribute is defined and is set appropriately to a value according to the rules defined ealier.

KeyboardEvent Sequence Sample

Consider the event sequence generated when we interact with the ShiftKey and the legend key 2 using a U.S keyboard layout and a UK keyboard layout.

Try experimenting using the following two test cases:

  1. Press and hold the shift key, then press key 2 and release it. Next, release the shift key.
  2. Press and hold the shift key, then press and hold key 2. Release the shift key. Finally, release key 2.

HTML

<div class="fx">
  <div>
    <textarea rows="5" name="test-target" id="test-target"></textarea>
    <button type="button" name="btn-clear-console" id="btn-clear-console">clear console</button>
  </div>
  <div class="flex">
    <div id="console-log"></div>
  </div>
</div>

CSS

.fx {
  -webkit-display: flex;
  display: flex;
  margin-left: -20px;
  margin-right: -20px;
}

.fx > div {
  padding-left: 20px;
  padding-right: 20px;
}

.fx > div:first-child {
   width: 30%;
}

.flex {
  -webkit-flex: 1;
  flex: 1;
}

#test-target {
  display: block;
  width: 100%;
  margin-bottom: 10px; 
}

JavaScript

let textarea = document.getElementById('test-target'),
consoleLog = document.getElementById('console-log'),
btnClearConsole = document.getElementById('btn-clear-console');

function logMessage(message) {
  let p = document.createElement('p');
  p.appendChild(document.createTextNode(message));
  consoleLog.appendChild(p);
}

textarea.addEventListener('keydown', (e) => {
  if (!e.repeat)
    logMessage(`first keydown event. key property value is "${e.key}"`);
  else
    logMessage(`keydown event repeats. key property value is "${e.key}"`);
});

textarea.addEventListener('beforeinput', (e) => {
  logMessage(`beforeinput event. you are about inputing "${e.data}"`);
});

textarea.addEventListener('input', (e) => {
  logMessage(`input event. you have just inputed "${e.data}"`);
});

textarea.addEventListener('keyup', (e) => {
  logMessage(`keyup event. key property value is "${e.key}"`);
});

btnClearConsole.addEventListener('click', (e) => {
  let child = consoleLog.firstChild;
  while (child) {
   consoleLog.removeChild(child);
   child = consoleLog.firstChild;
  }
});

Result

Case 1

When the shift key is pressed, a keydown event is first fired, and the key property value is set to the string "Shift". As we keep holding this key, the keydown event does not continue to fire repeatedly because it does not produce a character key.

When key 2 is pressed, another keydown event is fired for this new key press, and the key property value for the event is set to the string "@" for the U.S keyboard type and """ for the UK keyboard type, because of the active modifier shift key. The beforeinput and input events are fired next because a character key has been produced.

As we release the key 2, a keyup event is fired and the key property will maintain the string values "@" and """ for the different keyboard layouts respectively.

As we finally release the shift key, another keyup event is fired for it, and the key attribute value remains "Shift".

Case 2

When the shift key is pressed, a keydown event is first fired, and the key property value is set to be the string "Shift". As we keep holding this key, the keydown event does not continue to fire repeatedly because it produced no character key.

When key 2 is pressed, another keydown event is fired for this new key press, and the key property value for the event is set to be the string "@" for the U.S keyboard type and """ for the UK keyboard type, because of the active modifier shift key. The beforeinput and input events are fired next because a character key has been produced. As we keep holding the key, the keydown event continues to fire repeatedly and the KeyboardEvent.repeat  property is set to true. The beforeinput and input events are fired repeatedly as well.

As we release the shift key, a keyup event is fired for it, and the key attribute value remains "Shift". At this point, notice that the key property value for the repeating keydown event of the key 2 key press is now "2" because the modifier shift key is no longer active. The same goes for the InputEvent.data property of the beforeinput and input events.

As we finally release the key 2, a keyup event is fired but the key property will be set to the string value "2" for both keyboard layouts because the modifier shift key is no longer active.

Example

This example uses EventTarget.addEventListener() to listen for keydown events. When they occur,  the key's value is checked to see if it's one of the keys the code is interested in, and if it is, it gets processed in some way (possibly by steering a spacecraft, perhaps by changing the selected cell in a spreadsheet).

window.addEventListener("keydown", function (event) {
  if (event.defaultPrevented) {
    return; // Do nothing if the event was already processed
  }

  switch (event.key) {
    case "Down": // IE specific value
    case "ArrowDown":
      // Do something for "down arrow" key press.
      break;
    case "Up": // IE specific value
    case "ArrowUp":
      // Do something for "up arrow" key press.
      break;
    case "Left": // IE specific value
    case "ArrowLeft":
      // Do something for "left arrow" key press.
      break;
    case "Right": // IE specific value
    case "ArrowRight":
      // Do something for "right arrow" key press.
      break;
    case "Enter":
      // Do something for "enter" or "return" key press.
      break;
    case "Escape":
      // Do something for "esc" key press.
      break;
    default:
      return; // Quit when this doesn't handle the key event.
  }

  // Cancel the default action to avoid it being handled twice
  event.preventDefault();
}, true);

Specification

Specification Status Comment
Document Object Model (DOM) Level 3 Events Specification
La definición de 'KeyboardEvent.key' en esta especificación.
Obsolete Initial definition, included key values.

Browser compatibility

Update compatibility data on GitHub
DesktopMobile
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidEdge MobileFirefox for AndroidOpera for AndroidiOS SafariSamsung Internet
Soporte básicoChrome Soporte completo 51Edge Soporte completo SiFirefox Soporte completo 23IE Soporte completo 9
Notas
Soporte completo 9
Notas
Notas IE's impementation does not completely match the current spec because it is based on an older version of the spec.
Opera Soporte completo 38Safari Soporte completo SiWebView Android Soporte completo 51Chrome Android Soporte completo 51Edge Mobile Soporte completo SiFirefox Android Soporte completo 23Opera Android Soporte completo 38Safari iOS Soporte completo SiSamsung Internet Android ?
Non-printable keysChrome Soporte completo 51Edge ? Firefox Soporte completo 23IE Soporte completo 9
Notas
Soporte completo 9
Notas
Notas IE's impementation does not completely match the current spec because it is based on an older version of the spec.
Opera Soporte completo 38Safari ? WebView Android Soporte completo 51Chrome Android Soporte completo 51Edge Mobile ? Firefox Android Soporte completo 23Opera Android Soporte completo 38Safari iOS ? Samsung Internet Android ?
Printable keysChrome Soporte completo 51Edge ? Firefox Soporte completo 29IE Soporte completo 9
Notas
Soporte completo 9
Notas
Notas IE's impementation does not completely match the current spec because it is based on an older version of the spec.
Opera Soporte completo 38Safari ? WebView Android Soporte completo 51Chrome Android Soporte completo 51Edge Mobile ? Firefox Android Soporte completo 29Opera Android Soporte completo 38Safari iOS ? Samsung Internet Android ?
Dead keyChrome Soporte completo 51Edge ? Firefox Sin soporte NoIE Sin soporte NoOpera Soporte completo 38Safari ? WebView Android Soporte completo 51Chrome Android Soporte completo 51Edge Mobile ? Firefox Android Sin soporte NoOpera Android Soporte completo 38Safari iOS ? Samsung Internet Android ?

Leyenda

Soporte completo  
Soporte completo
Sin soporte  
Sin soporte
Compatibility unknown  
Compatibility unknown
Ver notas de implementación.
Ver notas de implementación.

Etiquetas y colaboradores del documento

Colaboradores en esta página: aleju92
Última actualización por: aleju92,