Contexte rapide:
Je suis le développeur principal de noVNC et j'ai un problème difficile: noVNC a besoin de la valeur charCode traduite sans utiliser l'événement keyPress pour les raisons suivantes:
En raison des différences dans les mises en page du clavier (c.-à-d. Différents modes de code à caractères chiffrés) j'ai déterminé que noVNC aura besoin d'une table de consultation pour différentes configurations de clavier.
Mais voici le vrai problème: sur d'autres mises en page, certaines touches physiques différentes ont la même clé de code. Par exemple, avec une disposition de clavier azerty (française), les touches de soulignement '-' (dash) et '_' génèrent la cléCode 189. Ack !!!
Alors … comment puis-je obtenir correctement keyCode à charCode cartographie et empêcher les actions par défaut du navigateur en même temps?
BTW, je soupçonne que la solution sera applicable à d'autres applications Web interactives et à des jeux HTML5 car vous souhaitez souvent connaître toutes les informations sur la touche appuyée sans déclencher de réponse supplémentaire du navigateur à cette touche.
Liens utiles:
Solution : voir mon message ci-dessous.
J'ai résolu ma propre question. Ce n'est pas une solution à 100%, mais cela devrait couvrir la plupart des besoins. Espérons qu'il y aura une solution plus propre lorsque les fournisseurs de navigateurs commenceront à intégrer les événements DOM Level 3 .
Juste pour ré-itérer les principales contraintes:
Sans une épiphanie excitante, les implémentations actuelles du navigateur semblent empêcher toutes les trois contraintes d'être complètement remplies. J'ai donc décidé de relâcher la contrainte n ° 3 un peu.
Sur l'événement keyDown du navigateur, ajoutez l'événement à une liste déroulante et vérifiez s'il s'agit d'une combinaison de touches sûres (sans comportement par défaut du navigateur indésirable)
Sûr : ne faites rien avant que la touche ne presse.
Inseguro : signaler / envoyer un événement clé vers le bas immédiatement. C'est là que la contrainte n ° 3 est décontractée car ces combinaisons de touches limitées ne sont pas traduites dans un code de caractère (beaucoup d'entre elles n'en ont pas encore).
Sur la touche du navigateur Appuyez sur l' événement (ce qui se produit immédiatement après l'événement keyDown) vérifiez s'il s'agit d'une combinaison de touches sûres:
Safe : signaler / envoyer un événement clé en bas. Mettre à jour la liste déroulante en utilisant le code de caractère traduit (event.which).
Inseguré : ne faites rien car il a déjà été signalé / envoyé pendant KeyDown.
Sur l'événement KeyUp du navigateur, recherchez et supprimez l'événement correspondant de la liste déroulante et utilisez le code traduit pour signaler / envoyer l'événement clé.
Quelques liens supplémentaires pour ceux intéressants:
C'est un champ de mines absolu et je vous exhorte à ne pas essayer cela si vous pouvez l'éviter. Non seulement il existe un historique long et enchevêtrement des constructeurs de navigateurs qui ne sont pas d'accord sur le comportement des événements clés, mais aussi qu'ils ne sont toujours pas d'accord et changent régulièrement le comportement clé de leurs navigateurs.
Voici le meilleur que je peux offrir et la ressource définitive sur les événements clés du navigateur: http://unixpapa.com/js/key.html
Si vous devez le faire, je pense que vous allez vous retrouver avec beaucoup de tableaux de cartographie de code clé qui seront dépassés très rapidement. Bonne chance.