Eventos de Teclado: KeyDown, KeyUp y KeyPress
Domina los eventos de teclado en JavaScript para crear atajos, validar entradas y mejorar la accesibilidad de tus aplicaciones web.
TL;DR - Resumen rápido
- keydown se dispara cuando se presiona una tecla, incluyendo teclas especiales (Shift, Ctrl, etc.)
- keyup se dispara cuando se suelta una tecla, útil para detectar el final de una acción
- event.key proporciona el valor de la tecla presionada (recomendado usar en lugar de keyCode)
- event.code identifica la ubicación física de la tecla, útil para juegos y aplicaciones internacionales
- Las teclas modificadoras (shiftKey, ctrlKey, altKey, metaKey) permiten crear atajos de teclado
Introducción a los Eventos de Teclado
Los eventos de teclado permiten que tus aplicaciones respondan a las acciones del usuario con el teclado. Desde simples validaciones de entrada hasta complejos atajos de teclado, estos eventos son fundamentales para crear interfaces accesibles y eficientes. JavaScript proporciona tres eventos principales de teclado: keydown, keyup y keypress (deprecado).
Entender cuándo usar cada evento y cómo acceder a la información de las teclas presionadas es esencial para implementar funcionalidades como navegación por teclado, atajos de aplicación, validación de formularios en tiempo real, y juegos. Los eventos de teclado modernos proporcionan propiedades estandarizadas que funcionan consistentemente en todos los navegadores.
keypress está deprecado
El evento keypress está oficialmente deprecado y no debe usarse en código nuevo. Solo se dispara para teclas que producen caracteres, lo que lo hace inconsistente. Usa keydown okeyup en su lugar, que funcionan con todas las teclas y tienen mejor soporte cross-browser.
Evento KeyDown
El evento keydown se dispara cuando el usuario presiona una tecla, antes de que se ingrese el carácter en el campo (si aplica). Este evento se dispara para todas las teclas, incluyendo teclas especiales como Shift, Ctrl, flechas, Enter, Escape, etc. Es el evento más versátil para detectar entrada de teclado.
Uso Básico de KeyDown
El evento keydown es ideal para implementar atajos de teclado, navegación, y validaciones que necesitan prevenir la entrada antes de que ocurra. Se puede usar tanto en elementos específicos (inputs, textareas) como a nivel global (document o window).
Este ejemplo muestra el uso básico de keydown. El evento proporciona información detallada sobre la tecla presionada a través de las propiedades key (valor de la tecla) y code(ubicación física). Puedes prevenir el comportamiento por defecto usando preventDefault(), útil para bloquear ciertas teclas o implementar validaciones personalizadas.
Repetición de Teclas
Una característica importante de keydown es que se dispara repetidamente mientras mantienes presionada una tecla. La velocidad de repetición depende de la configuración del sistema operativo del usuario. Puedes detectar si es una repetición usando la propiedad repeat del evento.
Este ejemplo muestra cómo detectar repeticiones de teclas. La propiedad repeat es true cuando el evento se dispara por mantener presionada una tecla, y false para la primera pulsación. Esto es útil cuando quieres ejecutar una acción solo la primera vez que se presiona una tecla, ignorando las repeticiones automáticas.
Control de repetición
Si quieres evitar la repetición automática de teclas, puedes verificar event.repeat y salir temprano del handler si es true. Esto es especialmente útil en juegos o aplicaciones donde una acción debe ejecutarse solo una vez por pulsación de tecla, sin importar cuánto tiempo el usuario mantenga presionada la tecla.
Evento KeyUp
El evento keyup se dispara cuando el usuario suelta una tecla. Este evento es útil para detectar el final de una acción, como cuando el usuario termina de escribir o suelta una tecla modificadora. A diferencia de keydown, keyup no se repite mientras mantienes presionada una tecla; solo se dispara una vez cuando la sueltas.
Uso Básico de KeyUp
El evento keyup es ideal para acciones que deben ocurrir después de que el usuario termina de presionar una tecla. Comúnmente se usa en combinación con keydown para detectar cuándo comienza y termina una acción, como mantener presionada una tecla para mover un personaje en un juego.
Este ejemplo muestra cómo usar keydown y keyup juntos para detectar cuando una tecla está siendo presionada. Este patrón es fundamental en videojuegos y aplicaciones interactivas donde necesitas saber el estado actual de las teclas (presionadas o no). El objeto teclasPresionadasmantiene un registro de qué teclas están actualmente presionadas.
KeyDown vs KeyUp: Cuándo Usar Cada Uno
Elegir entre keydown y keyup depende de tu caso de uso específico. Keydown es mejor para acciones inmediatas y preventivas, mientras que keyup es mejor para detectar el fin de una acción o para acciones que deben ocurrir después de que el usuario suelta la tecla. Para implementar búsqueda en tiempo real o autocompletado, es recomendable usar keyup en lugar de keydown, ya que con keyup el valor del input ya está actualizado cuando el evento se dispara, permitiéndote leer el valor completo directamente sin necesidad de usar setTimeout.
- <strong>keydown:</strong> Atajos de teclado, validación preventiva, juegos (inicio de acción)
- <strong>keyup:</strong> Búsqueda en tiempo real, fin de acciones, detección de entrada completa
- <strong>keydown + keyup:</strong> Detectar estado de teclas, movimiento continuo en juegos
- <strong>keydown con preventDefault:</strong> Bloquear entrada no deseada antes de que ocurra
- <strong>keyup sin preventDefault:</strong> Ejecutar acciones después de entrada completada
Propiedades del KeyboardEvent
El objeto KeyboardEvent proporciona varias propiedades para identificar qué tecla fue presionada. Las propiedades más importantes son key y code. Aunque keyCode todavía existe por compatibilidad, está oficialmente deprecado y no debe usarse en código nuevo.
event.key vs event.code
La diferencia entre key y code es fundamental. key representa el valor de la tecla (lo que se escribiría), mientras que code representa la ubicación física de la tecla en el teclado. La elección entre ambos depende de tu caso de uso.
Este ejemplo muestra la diferencia entre key y code. Si presionas la tecla A en un teclado QWERTY:key será "a" o "A" (dependiendo de Shift), mientras que code siempre será "KeyA". Usa key cuando te interese el carácter escrito (validación, autocompletado), ycode cuando te interese la posición física (juegos, atajos universales).
keyCode está deprecado
No uses event.keyCode en código nuevo. Esta propiedad está oficialmente deprecada y puede no funcionar consistentemente en todos los navegadores. Usa event.key o event.codeen su lugar, que son estándares modernos con mejor soporte y más claros de entender.
Otras Propiedades Útiles
Además de key y code, el KeyboardEvent proporciona varias propiedades útiles que te dan información adicional sobre el contexto de la pulsación de tecla. Estas propiedades te permiten crear interacciones más sofisticadas.
- <strong>key:</strong> El valor de la tecla ('a', 'Enter', 'ArrowUp', etc.)
- <strong>code:</strong> La ubicación física ('KeyA', 'Enter', 'ArrowUp', etc.)
- <strong>repeat:</strong> true si la tecla se mantiene presionada (solo keydown)
- <strong>location:</strong> Ubicación de la tecla (0=estándar, 1=izquierda, 2=derecha, 3=numpad)
- <strong>isComposing:</strong> true durante composición de caracteres (ej: acentos en español)
Este ejemplo muestra todas las propiedades principales del KeyboardEvent. La propiedad locationes útil cuando necesitas distinguir entre teclas duplicadas (Shift izquierdo vs derecho, Ctrl izquierdo vs derecho). La propiedad isComposing es importante para aplicaciones internacionales que soportan métodos de entrada de texto complejos.
Teclas Modificadoras
Las teclas modificadoras (Shift, Ctrl, Alt, Meta/Command) son fundamentales para crear atajos de teclado y combinaciones de teclas. El KeyboardEvent proporciona propiedades booleanas para detectar si estas teclas están presionadas junto con otra tecla.
Detectar Teclas Modificadoras
Cada tecla modificadora tiene su propia propiedad booleana: shiftKey, ctrlKey,altKey, y metaKey. Estas propiedades son true cuando la tecla está presionada junto con otra tecla. Son esenciales para implementar atajos de teclado estilo desktop en aplicaciones web.
Este ejemplo muestra cómo detectar teclas modificadoras. La tecla Meta es la tecla Command (⌘) en Mac y la tecla Windows en PC. Para atajos de teclado universales, es común usar ctrlKey || metaKeypara soportar tanto Ctrl en Windows/Linux como Command en Mac, proporcionando una experiencia consistente en todas las plataformas.
Implementar Atajos de Teclado
Los atajos de teclado mejoran significativamente la productividad de los usuarios avanzados. Implementarlos correctamente requiere combinar teclas modificadoras con teclas normales, y prevenir el comportamiento por defecto del navegador cuando sea necesario.
Este ejemplo muestra cómo implementar atajos de teclado comunes como Ctrl+S para guardar y Ctrl+Z para deshacer. Es crucial llamar a preventDefault() para evitar que el navegador ejecute su acción por defecto (como abrir el diálogo de guardar). Para una mejor experiencia, también proporciona feedback visual al usuario sobre los atajos disponibles.
Evita conflictos con el navegador
Ten cuidado al sobrescribir atajos de teclado nativos del navegador. Algunos atajos como Ctrl+T (nueva pestaña) o Ctrl+W (cerrar pestaña) no pueden prevenirse por razones de seguridad. Evita usar atajos muy comunes del navegador a menos que tengas una muy buena razón. Documenta claramente los atajos de tu aplicación.
Casos de Uso Prácticos
Los eventos de teclado tienen múltiples aplicaciones prácticas que mejoran significativamente la experiencia del usuario. Desde validación de formularios hasta navegación accesible, conocer estos patrones comunes te ayudará a crear aplicaciones más intuitivas y eficientes.
Validación de Entrada en Tiempo Real
Validar la entrada del usuario en tiempo real proporciona feedback inmediato y evita que se ingresen datos inválidos. Esto es especialmente útil para campos que solo deben aceptar ciertos caracteres, como números, letras, o formatos específicos.
Este ejemplo muestra cómo validar entrada permitiendo solo ciertos tipos de caracteres. Para campos numéricos, permitimos números y teclas de navegación (flechas, backspace, delete). Para campos de texto, validamos el formato completo cuando el usuario termina de escribir (keyup). Recuerda que la validación client-side debe complementarse con validación server-side para seguridad.
Resumen: Eventos de Teclado
Conceptos principales:
- •keydown se dispara cuando se presiona una tecla, incluyendo teclas especiales
- •keyup se dispara cuando se suelta una tecla, útil para detectar el final de una acción
- •event.key proporciona el valor de la tecla, event.code la ubicación física
- •Las teclas modificadoras (shiftKey, ctrlKey, altKey, metaKey) permiten crear atajos
- •keypress está deprecado, usa keydown o keyup en su lugar
Mejores prácticas:
- •Usa event.key en lugar de keyCode deprecado para identificar teclas
- •Implementa validación en tiempo real con preventDefault() en keydown
- •Usa keyup para búsqueda y autocompletado (valor ya está actualizado)
- •Evita sobrescribir atajos críticos del navegador sin buena razón
- •Implementa navegación por teclado para mejorar accesibilidad