Comment obtenir la valeur brute un champ <input type = "number">?

Comment puis-je obtenir la valeur "réelle" d'un champ <input type="number"> ?


J'ai une boîte de input , et j'utilise le nouveau number type d'entrée HTML5:

 <input id="edQuantity" type="number"> 

Ceci est principalement pris en charge dans Chrome 29:

Entrez la description de l'image ici

Ce dont j'ai besoin maintenant, c'est la capacité de lire la valeur "brute" que l'utilisateur a saisie dans la zone de saisie. Si l'utilisateur a entré un nombre:

Entrez la description de l'image ici

Alors edQuantity.value = 4 , et tout va bien.

Mais si l'utilisateur entre dans un texte non valide, je veux colorer le rouge de la boîte d'entrée:

Entrez la description de l'image ici

Malheureusement, pour une zone de saisie type="number" , si la valeur dans la zone de texte n'est pas un nombre, alors la value renvoie une chaîne vide:

 edQuantity.value = "" (String); 

(Au moins à Chrome 29)

Comment puis-je obtenir la valeur "brute" d'un contrôle <input type="number"> ?

J'ai essayé de regarder la liste des autres propriétés de la boîte de saisie de Chrome:

Entrez la description de l'image ici

Je n'ai rien vu de l'entrée réelle.

Je ne pourrais pas non plus trouver un moyen de dire si la case "est vide" ou non. Peut-être que je pourrais avoir déduit:

 value isEmpty Conclusion ============= ============= ================ "4" false valid number "" true empty box; not a problem "" false invalid text; color it red 

Remarque : Vous pouvez ignorer tout après la règle horizontale; C'est juste un remplissage pour justifier la question. Aussi: ne confondez pas l'exemple avec la question. Les personnes pourraient vouloir la réponse à cette question pour des raisons autres que la coloration de la boîte rouge (Un exemple: convertir le texte "four" en symbole latin "4" pendant l'événement onBlur)

Comment puis-je obtenir la valeur "brute" d'un contrôle <input type="number"> ?

Bonus de lecture

  • JsFiddle de tout ce qui précède (mis à jour)
  • Entrée Quirkmode.org pour les nouveaux types de saisie

Selon le WHATWG , vous ne devriez pas pouvoir obtenir la valeur à moins qu'il ne s'agisse d'une entrée numérique valide. L'algorithme de désinfection du champ de numéro d'entrée indique que le navigateur est censé définir la valeur dans une chaîne vide si l'entrée n'est pas un nombre de virgule flottante valide.

L' algorithme de désinfection des valeurs est le suivant: si la valeur de l'élément n'est pas un nombre à virgule flottante valide , définissez-le à la chaîne vide à la place.

En spécifiant le type ( <input type="number"> ), vous demandez au navigateur de faire du travail pour vous. Si, d'autre part, vous souhaitez capturer l'entrée non numérique et faire quelque chose avec elle, vous devriez compter sur l'ancien champ de saisie de texte essayé et authentique et analyser le contenu vous-même.

Le W3 a également les mêmes spécifications et ajoute:

Les agents utilisateurs ne doivent pas permettre à l'utilisateur de définir la valeur sur une chaîne non vide qui n'est pas un nombre à virgule flottante valide.

Il ne répond pas à la question, mais la solution utile est de vérifier

 edQuantity.validity.valid 

Le ValidityState d'un objet donne des indices sur ce que l'utilisateur a entré. Considérons une entrée type="number" avec un ensemble min et max

 <input type="number" min="1" max="10"> 

Nous voulons toujours utiliser .validity.valid .

Les autres propriétés ne donnent que des informations supplémentaires:

 Users Input .value .valid | .badInput .rangeUnderflow .rangeOverflow ============ ====== ====== | ========= =============== ============== "" "" true | false false false ;valid because field not marked required "1" "1" true | false false false "10" "10" true | false false false "0" "0" false | false true false ;invalid because below min "11" "11" false | false false true ;invalid because above max "q" "" false | true false false ;invalid because not number "³" "" false | true false false ;superscript digit 3 "٣" "" false | true false false ;arabic digit 3 "₃" "" false | true false false ;subscript digit 3 

Vous devrez vous assurer que le navigateur prend en charge la validation HTML5 avant de l'utiliser:

 function ValidateElementAsNumber(element) { if ((element.validity) && (!element.validity.valid)) { //if html5 validation says it's bad: it's bad return false; } //Fallback to browsers that don't yet support html5 input validation //Or we maybe want to perform additional validations var value = StrToInt(element.value); if (value != null) return true; else return false; } 

Prime

Spudly a une réponse utile qu'il a supprimé:

Utilisez simplement le CSS :invalid sélecteur :invalid pour cela.

 input[type=number]:invalid { background-color: #FFCCCC; } 

Cela déclenchera votre élément pour devenir rouge chaque fois qu'un numéro non numérique valide est entré.

Le support du navigateur pour <input type='number'> est à peu près identique à :invalid , donc pas de problème.

En savoir plus sur :invalid ici .

Remarque : Tout code est diffusé dans le domaine public. Aucune attribution requise.

 input.focus(); document.execCommand("SelectAll"); var displayValue = window.getSelection().toString(); 

Suivre toutes les touches pressées en fonction de leurs codes clés

Je suppose que l'on pourrait écouter les événements de la souris et garder un tableau de tous les caractères saisis, en fonction de leurs codes clés. Mais c'est une tâche assez ennuyeuse et probablement sujet à des bugs.

http://unixpapa.com/js/key.html

Sélectionnez l'entrée et obtenez la sélection en tant que chaîne

 input.select(); var value = window.getSelection().toString(); 

Tout crédit à: int32_t