Est-il correct d'ignorer les événements de détresse avec keyCode = 229?

Au début, je voulais surveiller les changements d'un <input type="text"> en temps réel (par exemple, exactement quand l'utilisateur appuie sur une touche). L'événement onChange n'a pas fonctionné car il n'est déclenché que lorsque l'utilisateur appuie sur Entrée ou supprime la mise au point de l'élément de saisie. Ensuite, j'ai vu cette question sur StackOverflow. J'ai essayé le code de cette réponse, mais le problème est que je ne veux pas être informé pour les pressions de touches qui ne représentent pas les caractères imprimables, alors j'ai dû le modifier de cette façon pour vérifier qu'il existe des caractères imprimables dans les événements :

 ... textInputElement.onKeyDown.listen((KeyboardEvent ev) { if (new String.fromCharCode(ev.keyCode).length > 0) { callAFunction(); } }); ... 

(+ Le même changement pour l'événement onKeyUp )

Lorsque j'ai testé cela dans Dartium, j'ai vu qu'en concentrant l'élément de saisie, puis en appuyant sur n'importe quelle touche, un événement de ev.keyCode = ev.which = 229 est déclenché avec ev.keyCode = ev.which = 229 et ev.charCode = 0 . Immédiatement après cet événement, un autre événement de ev.keyCode = ev.which est déclenché avec le bon ev.keyCode = ev.which de la touche pressée et ev.charCode = 0 . Je ne comprenais pas d'où provenait cette clé, mais j'ai vu que c'était un personnage imprimable, å . J'ai cherché Internet et j'ai constaté que d'autres ont ce problème, et parfois ils utilisent d'autres langages et technologies de programmation. Un lien pertinent est celui-ci et le correctif choisi est dans ce très petit commit – ils ont choisi d'ignorer tous les événements qui ont keyCode = 229 avec l'explication que les versions récentes de Chrome / Chromium / WebKit ont commencé à envoyer ces événements de dépannage avant chaque événement de clavier standard , Et que leur sens est que l' utilisateur appuie sur un bouton. Mais la méthode de saisie est toujours en cours de traitement ou l'éditeur de méthode d'entrée traite l'entrée de clé .

Ma question est, est-ce OK d'ignorer keydown événements de keyCode = 229 avec keyCode = 229 si le new String.fromCharCode(229) renvoie le caractère imprimable " å "? J'ai pensé à la situation possible d'avoir une clé réelle qui produit le même code de clé et son caractère correspondant.

Je vous remercie pour tout type d'aide!

La réponse courte est Non. Vous pouvez ignorer les événements de base avec keyCode = 229, mais seulement s'ils suivent immédiatement après un événement de pression de touche.

Si vous retirez certaines clés, certains navigateurs envoient un événement de détresse répété avec une valeur de code de 229, tandis que d'autres envoient à nouveau la touche de détresse de l'original. Certains navigateurs envoient 0 en tant que code de clé associé à l'événement de saisie de touche et placez le code de caractère dans une propriété charCode.

Dans tous les cas, dans la mesure où je peux le dire à partir de mes tests, l'ordre des événements est toujours prévisible:

 keydown (event.keyCode = key-keyCode ex: 65 = "A") keypress (event.keyCode = 0 | character-keyCode ex: 97 = "a") - conflated model event.charCode = character-keyCode - split model keydown (event.keyCode = 229 | key-keyCode ex: 229 | 65) - may be repeated keyup (event.keyCode = key-keyCode ex: 65) 

La lettre å est utilisée dans plusieurs langues scandinaves. Voici les événements reçus dans Safari 6.1.5 lorsque le clavier est réglé sur le suédois ou le finnois, et le caractère å (à gauche de la touche P) est pressé:

 EVENT keyCode keydown 219 ("[" key position) keypress 229 (å) keydown 229 (repeatedly, indicating that the Input Monitor is busy) keyup 219 

Notez que le keydown key key initial est 219, pas 229.

Pour générer un code-clé 229 sur l'événement de déroulement initial, vous pouvez appuyer sur n'importe quelle "clé morte". Sur le clavier suédois sur Mac, par exemple, la touche immédiatement à gauche de la touche BACKSPACE est '(accent aigu), comme utilisé dans des mots comme déjà-vu. Lorsque vous appuyez sur une touche morte, le caractère apparaît dans le champ de saisie, mais le point d'insertion ne bouge pas. Lorsque vous tapez ensuite un caractère qui peut être combiné avec celui-ci, le navigateur peut remplacer le caractère de clé morte initiale par un caractère composite ('+ e = é) qui possède sa propre valeur Unicode.

Voici les événements que vous verrez dans Safari 6.1.5 lorsque l'utilisateur appuie et relève 'suivi par e sur un clavier suédois:

 EVENT keyCode keydown 229 (dead key) keyup 187 (acute accent) keydown 229 (second key is being treated) keyup 69 ("E") 

Notez qu'il n'y a pas d'événements de pression de touche envoyés du tout, car il n'y a pas de touche "é" en tant que telle qui a été pressée. Si vous souhaitez déterminer quel caractère l'utilisateur a entré, vous pouvez attendre après la deuxième saisie, puis lisez le caractère dans le champ de saisie.

En d'autres termes, vous pouvez ignorer tous les événements de dépannage avec un code-clé 229 après un événement de pression de touche, mais si vous ignorez les 229 codes-clés, vous pouvez empêcher les utilisateurs d'ajouter différents caractères diacritiques.

Pour plus d'informations sur keyCode 229, à partir du site w3.org : propriété keyCode des événements clés