web-dev-qa-db-fra.com

keyCode sur Android est toujours 229

Sur mon Samsung Galaxy Tab 4 (Android 4.4.2, Chrome: 49.0.2623.105), je me suis heurté à une situation où le code de clé est toujours 229. 

J'ai mis en place un test simple pour deux situations

<div contenteditable="true"></div>
<input>
<span id="keycode"></span>

scénario:

$('div, input').on('keydown', function (e) {
    $('#keycode').html(e.keyCode);
});

DEMO

Heureusement, je peux trouver des publications à ce sujet, mais je ne pouvais pas en trouver une avec une solution opérationnelle. Quelqu'un a suggéré d'utiliser keyup à la place ou d'utiliser l'événement textInput, mais celui-ci est déclenché uniquement sur blur.

Pour couronner le tout, cela ne se produit pas avec le navigateur de stock par défaut :(

Toute aide serait appréciée!

UPDATE: S'il s'avère que cela n'est pas possible, je peux toujours saisir le caractère avant le curseur: post

27
Jeanluca Scaljeri

L'événement de frappe normale ne donne pas keyCode dans un appareil Android. Il y a déjà eu un gros { discussion } _ à ce sujet.

Si vous souhaitez capturer la presse de space bar ou special chars, vous pouvez utiliser l'événement textInput.

$('input').on('textInput', e => {
     var keyCode = e.originalEvent.data.charCodeAt(0);
     // keyCode is ASCII of character entered.
})

Remarque: textInput ne se déclenche pas sur les alphabets, les chiffres, les retours à l’arrière, les touches Entrée et quelques autres. 

17
Imamudin Naseem

Le même problème ne se produit qu'avec le clavier Samsung standard sur Android. Une solution consistait à désactiver les prédictions du clavier, ce qui corrigeait la saisie. Nous analysons encore plus pour voir si un contournement peut être trouvé dans JS Land.

Edit: J'ai réussi à trouver une solution à notre cas. Ce qui se passait, c’est que nous avions une liste blanche de caractères autorisés qu’un utilisateur était autorisé à saisir dans notre zone de saisie. Il s’agissait de caractères alphanumériques et de certains caractères de contrôle inscrits sur la liste blanche (par exemple, entrer, échap, haut/bas). L'événement par défaut serait empêché pour toute autre entrée de caractère.

En réalité, tous les événements associés au code d'activation 229 ont été empêchés et aucun texte n'a donc été entré. Une fois que nous avons ajouté le code d'activation 229 à la liste blanche, tout est redevenu opérationnel.

Par conséquent, si vous utilisez un type de composant de contrôle de saisie de formulaire personnalisé ou tiers, assurez-vous de vérifier que le code d'activation 229 est sur liste blanche/autorisé et qu'il n'est pas empêché par défaut. 

J'espère que ça aide quelqu'un.

3
Adam Reis

J'avais le même problème sur les téléphones Samsung S7. Résolu en remplaçant l'événement de keydown par keypress.

$("div, input").keypress(function (e) {
    $("#keycode").html(e.which); 
});

jQuery normalise ce genre de choses, il est donc inutile d'utiliser autre chose que e.which https://stackoverflow.com/a/302161/259881

3
x-freestyler

J'avais le même problème et je ne trouvais aucune solution .. Je l'ai résolu en javascript.

event.target.value.charAt (event.target.selectionStart -1) .charCodeAt ()

1
Sandeep


Je sais que je réponds à un ancien message, mais le problème est toujours d'actualité et j'aime partager mon point de vue.
Cependant, cette méthode n’est pas une solution exacte, mais une solution d’urgence comme celle que j’avais. 
La clé consiste à utiliser la valeur de la zone de texte lors de l’utilisation de la touche. pour chaque pression sur une touche, la valeur change et à la dernière mise à jour, nous pouvons déterminer quelle touche a été enfoncée.
Remarque: cela ne fonctionne que pour la police visible sur le clavier, c'est-à-dire les caractères alphanumériques et les caractères spéciaux, cela n'enregistrera aucune touche de contrôle, touche Maj ou Alt comme vous le savez

  $('input').keyup(function () {
  var keyChar = $(this).val().substr(-1);

 //you can do anything if you are looking to do something with the visible font characters
  });
0
Nair Ranjith