Déclenchement permettant des nombres, mais pas des symboles de changement sur iPhone

J'ai un événement lié à une entrée qui ne devrait permettre que des nombres. Simplifié:

function (e) { if (-1 === [48,49,50,51,52,53,54,55,56,57].indexOf(e.keyCode)) { e.preventDefault(); } } 

Cela fonctionne bien, mais si quelqu'un tape ! , @ , # , $ , Etc. KeyCode est toujours le même et le défaut d'événement n'est pas empêché.

Sur un clavier physique, je peux l'éviter tout simplement en vérifiant e.shiftKey . Cependant, sur un clavier virtuel iOS, certains de ces caractères existent (comme $ ) même pour <input type=number> et ils peuvent être tapés directement. Leur codeCode est le même, mais il semble que e.shiftKey soit toujours faux.

Il existe une variété de solutions possibles qui seraient acceptables pour moi:

  • Avoir le clavier virtuel lui-même ne pas afficher ces caractères (c.-à-d. Uniquement les numéros d'affichage et une période / décimale)
  • Détectez qu'une clé virtuelle non valide a été pressée et supprimez le comportement de l'événement
  • Déterminez qu'un caractère invalide sera ajouté à la valeur de l'entrée et supprimez le comportement de l'événement dans ce cas
  • Autres?

Vous pouvez utiliser <input type="tel" /> pour limiter l'entrée aux nombres dans iOS – bien que cela permette également "* 'et' #" d'être dactylographié, du moins il est moins de travail car il vous suffit de vérifier Pour ces deux personnages