Comment obtenir la valeur brute d'un champ?

Comment puis-je obtenir de l' "réel" valeur de <input type="number"> champ?


J'ai une boîte input, et j'utilise un type d'entrée HTML5 plus récent number:

<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 de pouvoir lire la valeur "raw" que l'utilisateur A entrée dans la zone de saisie. Si l'Utilisateur a entré un nombre:

entrez la description de l'image ici

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

Mais si l'utilisateur entre invalide texte, je veux colorer la zone d'entrée en Rouge:

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, value renvoie une chaîne vide:

edQuantity.value = "" (String);

(dans Chrome 29 au moins)

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

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

entrez la description de l'image ici

Je n'ai rien vu qui ressemble au réel entrée.

Je ne pouvais pas non plus trouver un moyen de savoir si la boîte "est vide" , ou non. Peut-être que j'aurais pu déduire:

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

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

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

Lecture Bonus

107
demandé sur Ian Boyd 2013-09-17 18:10:53

4 réponses

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

L'algorithme de désinfection de la valeur est le suivant: si la valeur du l'élément n'est pas un nombre à virgule flottante valide , puis définissez-le sur le vide chaîne plutôt.

En spécifiant le type (<input type="number">), vous demandez au navigateur de faire du travail pour vous. Si, d'un autre côté, vous souhaitez pouvoir capturer l'entrée non numérique et en faire quelque chose, vous devez vous appuyer sur l'ancien champ de saisie de texte éprouvé et analyser le contenu vous-même.

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

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

52
répondu j08691 2013-09-17 15:15:55

Il ne répond pas à la question, mais la solution de contournement 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 toujours voulez utiliser .validity.valid.

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

User's 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)
{
   //Public Domain: no attribution required.
   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;
}

Bonus

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

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

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

Cela déclenchera votre élément à devenir rouge chaque fois qu'un valide est entré.

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

En savoir plus sur :invalid ici.

47
répondu Ian Boyd 2018-09-17 16:05:09
input.focus();
document.execCommand("SelectAll");
var displayValue = window.getSelection().toString();
11
répondu int32_t 2013-09-18 02:50:34

Suivre toutes les touches enfoncées en fonction de leurs codes de touches

Je suppose que l'on pourrait écouter les événements keyup et conserver un tableau de tous les caractères entrés, en fonction de leurs keycodes. Mais c'est une tâche assez fastidieuse et probablement sujette à des bugs.

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

Sélectionnez l'entrée et obtenez la sélection sous forme de chaîne

document.querySelector('input').addEventListener('input', onInput);

function onInput(){
  this.select(); 
  console.log( window.getSelection().toString() )
}
<input type='number'>

Tout le crédit à: int32_t

3
répondu sandstrom 2018-05-17 12:20:09