Lliçó 6 de 10 · 13 min de lectura · Revisada el 26/10/2026
Esdeveniments de teclat i dreceres pròpies: implementar-les sense trencar res
Estàs llegint una lliçó oberta. Matricula't gratis per fer els tests i els exercicis, desar el teu progrés i aconseguir el certificat.
A la primera lliçó vam veure què exigeix el 2.1.4 Dreceres de teclat i a l'anterior vam escriure gestors per a les fletxes. Tan bon punt una aplicació creix (un gestor d'expedients, un editor, un tauler d'administració), apareixen dreceres pròpies: Ctrl+K per cercar, / per anar al cercador, ? per a l'ajuda. Implementar-les bé exigeix conèixer l'API d'esdeveniments de teclat, les particularitats del teclat espanyol i les combinacions que ja ocupen el navegador, el sistema i els lectors de pantalla. Una drecera mal triada no només no ajuda: impedeix escriure una arrova o deixa sense funcions qui fa servir NVDA.
keydown, key i code
L'esdeveniment per reaccionar a una pulsació és keydown. Es dispara en prémer i es repeteix mentre es manté la tecla (la propietat e.repeat indica les repeticions). keyup té usos puntuals; keypress i les propietats keyCode i which estan obsoletes i no les hauries de fer servir en codi nou.
Cada esdeveniment porta dues propietats que convé no confondre:
e.key: el valor lògic de la tecla, és a dir, el caràcter que produeix ("a","A","/") o el seu nom ("Enter","Escape","ArrowDown"). Depèn de la distribució del teclat.e.code: la posició física de la tecla ("KeyA","Digit7"), amb noms presos del teclat nord-americà i independent de la distribució.
Regla pràctica: per a dreceres de lletra o símbol, fes servir key, que coincideix amb el que la persona veu imprès a la seva tecla. Reserva code per a quan importi la posició, com en un joc que fa servir les tecles de direcció de la mà esquerra.
| El que prem la persona (teclat espanyol) | e.key | e.code |
|---|---|---|
| Retorn | "Enter" | "Enter" |
| Espai | " " | "Space" |
| Maj+7 | "/" | "Digit7" |
| La tecla de l'accent, a la dreta de la Ñ | "Dead" | "Quote" |
| AltGr+E a Windows | "€", amb ctrlKey i altKey a true | "KeyE" |
Exemple
Una drecera / per anar al cercador, programada en un equip amb teclat nord-americà, on la barra té tecla pròpia:
if (e.code === 'Slash') buscador.focus(); // incorrecteEn un teclat espanyol, la tecla que ocupa aquesta posició produeix el guió, així que la drecera es dispararia amb «-» i mai amb la barra, que aquí s'escriu amb Maj+7. Amb e.key === '/' funciona en qualsevol distribució.
Modificadors i teclat espanyol
Les propietats ctrlKey, altKey, shiftKey i metaKey indiquen quins modificadors estaven premuts. metaKey correspon a la tecla Cmd a macOS, on les convencions fan servir Cmd allà on Windows fa servir Ctrl; el més senzill és acceptar-les totes dues: (e.ctrlKey || e.metaKey) && e.key === 'k'.
Dos paranys propis del nostre teclat:
- AltGr equival a Ctrl+Alt a Windows. En un teclat espanyol, l'arrova, el coixinet, l'euro, els claudàtors, les claus i la barra inversa s'escriuen amb AltGr, i Windows notifica aquesta tecla com a Ctrl+Alt. Si defineixes Ctrl+Alt+E per exportar, cada vegada que algú escrigui «€» exportarà el document; amb Ctrl+Alt+2, no podrà escriure una adreça de correu. Evita les combinacions Ctrl+Alt amb lletres, números i signes.
- Tecles mortes i mètodes d'entrada. Per escriure «á» es prem primer la tecla de l'accent, que arriba com a
e.key === "Dead", i després la «a». En idiomes com el xinès o el japonès, la composició de caràcters marca els esdeveniments ambe.isComposing. Si un camp de text processakeydownper construir o filtrar el que s'escriu, trencarà aquestes entrades. Per reaccionar al que s'ha escrit, escolta l'esdevenimentinput.
Combinacions ocupades
No hi ha cap espai de dreceres lliure en tots els entorns. Abans de triar, revisa amb qui pots xocar:
- El navegador. Algunes combinacions no es poden capturar des d'una pàgina (a Chrome, per exemple, Ctrl+T, Ctrl+W o Ctrl+N). D'altres sí que es poden capturar, com Ctrl+F o Ctrl+P, però la persona n'espera el comportament habitual: substitueix-les només si ofereixes alguna cosa equivalent, com una cerca dins d'un document llarg que el navegador no pot fer.
- El sistema operatiu. Alt+Tab, les combinacions amb la tecla Windows o Ctrl+Alt+Supr no arriben mai a la pàgina. A Windows, Alt+Maj pot canviar la distribució del teclat si n'hi ha diverses d'instal·lades.
- Els lectors de pantalla. NVDA fa servir Insert (i opcionalment Bloq Maj) com a tecla pròpia; NVDA i JAWS fan servir Ctrl+Alt+fletxes per recórrer taules; VoiceOver a macOS fa servir Ctrl+Opció com a prefix. A més, en mode d'exploració els lectors intercepten les lletres soltes, com veuràs a la lliçó sobre tecnologies de suport.
Tria poques dreceres, comprova-les amb les llistes de combinacions dels navegadors i lectors més utilitzats, mostra-les a la interfície i permet reassignar-les. Així compleixes el 2.1.4 si són d'una sola tecla i evites conflictes en tots els casos.
Una drecera d'una sola tecla ben implementada
Recordem les condicions del 2.1.4: una drecera d'una sola tecla s'ha de poder desactivar, reassignar o estar limitada al component amb focus. A més, per pura usabilitat, no s'ha de disparar mai mentre la persona escriu. Aquest gestor reuneix les comprovacions necessàries:
const ajustes = cargarPreferencias(); // { atajosDeUnaTecla: true }, desat al perfil
document.addEventListener('keydown', (e) => {
if (!ajustes.atajosDeUnaTecla) return; // 2.1.4: es poden desactivar
if (e.defaultPrevented || e.isComposing) return; // un altre component ja l'ha gestionat
if (e.ctrlKey || e.metaKey || e.altKey) return; // no és una drecera d'una tecla
const t = e.target;
if (t.isContentEditable || t.closest('input, textarea, select')) return; // està escrivint
if (e.key === '/') {
e.preventDefault();
document.getElementById('buscar').focus();
} else if (e.key === '?') {
e.preventDefault();
abrirAyudaDeAtajos();
}
});
Fixa't que no es descarta shiftKey: en el teclat espanyol tant / com ? requereixen Maj. I que preventDefault() només es crida per a les tecles que fa servir la drecera; qualsevol altra pulsació segueix el seu curs.
Per donar a conèixer les dreceres, combina tres coses: una ajuda accessible des de la interfície (un botó «Dreceres de teclat» que obre un diàleg amb la llista, i l'opció de desactivar-les), la combinació visible al costat de l'acció (al menú, «Exporta Ctrl+Maj+E») i l'atribut aria-keyshortcuts, que exposa la drecera a les tecnologies de suport:
<button type="button" aria-keyshortcuts="Control+Shift+E">Exporta</button>
aria-keyshortcuts només informa: no implementa la drecera, i no tots els lectors l'anuncien. No substitueix el fet de mostrar-la a la pantalla.
Error freqüent
document.addEventListener('keydown', (e) => {
e.preventDefault(); // perquè el navegador no interfereixi
gestionarAtajo(e);
});Un preventDefault() general al document anul·la Tab, les fletxes dins dels camps, Espai als botons i l'escriptura en qualsevol formulari. És una manera ràpida de convertir la pàgina sencera en inoperable amb teclat (2.1.1). Cancel·la només la tecla concreta que has gestionat.
Detalls que marquen la diferència
- Retorn i Espai en botons propis. En un botó natiu, Retorn dispara el clic en prémer i Espai en deixar anar. Si reconstrueixes un botó, imitar aquest detall és un refinament; l'imprescindible és que totes dues tecles funcionin.
- Escapada amb jerarquia. Escapada ha de tancar l'últim que s'ha obert (el desplegable dins del diàleg abans que el diàleg), no tot alhora. Atura la propagació al component que la gestiona.
- Tecles mantingudes. Si una acció no s'ha de repetir (enviar, esborrar), ignora els esdeveniments amb
e.repeat. - No dupliquis el que és natiu. Si un
buttonreal ja executa la seva acció a l'esdevenimentclick, no hi afegeixis un gestor de Retorn que també la cridi: el navegador ja genera el clic amb aquesta tecla i l'acció s'executarà dues vegades.
Prova-ho tu
En qualsevol pàgina, obre la consola de les eines per a desenvolupadors (F12) i enganxa-hi aquesta línia:
addEventListener('keydown', (e) => console.log(e.key, e.code, e.ctrlKey, e.altKey, e.shiftKey));Prem Maj+7, la tecla de l'accent i, si fas servir Windows, AltGr+E. Fixa't en quins valors arriben i pensa quines dreceres de la teva aplicació es dispararien amb aquests valors.
Punt clau
Fes servir keydown i e.key, evita Ctrl+Alt per AltGr, no disparis dreceres mentre la persona escriu, cancel·la només les tecles que gestiones i ofereix sempre una manera de veure, desactivar i reassignar les dreceres.
Resum
keydownés l'esdeveniment correcte;keypress,keyCodeiwhichestan obsolets.e.keyés el que produeix la tecla ie.code, la seva posició física; per a dreceres de lletres i símbols, fes servirkey.- A Windows, AltGr arriba com a Ctrl+Alt: aquestes combinacions xoquen amb l'escriptura en espanyol i en català.
- Revisa els conflictes amb el navegador, el sistema i els lectors de pantalla; mostra les dreceres i permet desactivar-les o reassignar-les.
- No disparis mai una drecera dins d'un camp de text ni cridis
preventDefault()de manera general.
Portes 8 lliçons d'aquest curs: que no es perdin
Crea el teu compte gratis i desa el que ja has llegit i segueix el curs amb tot:
- El test d'aquesta lliçó (3 preguntes) per comprovar el que has après
- Exercicis pràctics amb pàgines reals
- El teu progrés desat: continues on ho vas deixar, des de qualsevol dispositiu
- Constància del curs amb les hores i certificat gratuït del nivell 3 quan aprovis l'examen
Entres amb el teu compte de Google o només amb el teu correu electrònic. No cal contrasenya.