Wie erhalte ich den Rohwert für ein Feld <input type = “number”>?

117

Wie kann ich den "echten" Wert eines <input type="number">Feldes ermitteln?


Ich habe eine inputBox und verwende einen neueren HTML5-Eingabetyp number:

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

Dies wird hauptsächlich in Chrome 29 unterstützt:

Geben Sie hier die Bildbeschreibung ein

Was ich jetzt brauche, ist die Fähigkeit, den "rohen" Wert zu lesen, den der Benutzer in das Eingabefeld eingegeben hat. Wenn der Benutzer eine Nummer eingegeben hat:

Geben Sie hier die Bildbeschreibung ein

dann edQuantity.value = 4und alles ist gut.

Aber wenn der Benutzer ungültigen Text eingibt, möchte ich das Eingabefeld rot färben:

Geben Sie hier die Bildbeschreibung ein

type="number"Wenn für ein Eingabefeld der Wert im Textfeld keine Zahl ist, wird leider valueeine leere Zeichenfolge zurückgegeben:

edQuantity.value = "" (String);

(mindestens in Chrome 29)

Wie kann ich den "rohen" Wert eines <input type="number">Steuerelements ermitteln?

Ich habe versucht, die Liste der anderen Eigenschaften des Eingabefelds in Chrome zu durchsuchen:

Geben Sie hier die Bildbeschreibung ein

Ich habe nichts gesehen, was der tatsächlichen Eingabe ähnelt.

Ich konnte auch nicht feststellen, ob die Box "leer" ist oder nicht. Vielleicht hätte ich folgern können:

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

Hinweis : Sie können alles nach der horizontalen Regel ignorieren. Es ist nur Füllstoff, um die Frage zu rechtfertigen. Außerdem: Verwechseln Sie das Beispiel nicht mit der Frage. Die Antwort auf diese Frage kann aus anderen Gründen als der roten Färbung des Kästchens gewünscht werden (Ein Beispiel: Konvertieren des Textes "four"in das lateinische "4"Symbol während des onBlur-Ereignisses)

Wie kann ich den "rohen" Wert eines <input type="number">Steuerelements ermitteln?

Bonuslesung

Ian Boyd
quelle
2
Der 'echte' Wert eines numerischen Eingabefeldes muss eine Zahl sein. Wenn Sie andere Eingaben als numerische Werte zulassen möchten, numberist dies nicht der Eingabetyp, den Sie suchen. Verwenden Sie einen normalen textEingang.
Robertc
7
@robertc Chrome ist der Agent, der andere Eingaben als Zahlen zulässt. Ich muss nur wissen, dass sie andere Dinge als Zahlen eingegeben haben .
Ian Boyd
1
Überprüfen Sie den validityStatus des Feldes - ich würde erwarten, typeMismatchaber ich habe mich nicht überprüft.
Robertc
2
@ int32_t Lesen Sie die sechste Zeile nach unten (dh "Aber wenn der Benutzer eingibt ..." )
Ian Boyd
6
Mein Anwendungsfall ... Ich habe zwei numerische Felder: Breiten- und Längengrad. Ich möchte feststellen, ob jemand "lat, lon" einfügt und entsprechend behandelt. Dies ist derzeit mit type = "number" nicht möglich. da "lat, lon" ungültig ist, gibt es keine Möglichkeit, den "raw" -Wert zum Ausführen eines regulären Ausdrucks zu erhalten. Ein weiterer Anwendungsfall: Anzeigen eines Kundenfehlers: " blahist eine ungültige Nummer".
Brad Kent

Antworten:

55

Laut WHATWG sollten Sie den Wert nur erhalten können, wenn es sich um eine gültige numerische Eingabe handelt. Der Bereinigungsalgorithmus des Eingabezahlenfelds besagt, dass der Browser den Wert auf eine leere Zeichenfolge setzen soll, wenn die Eingabe keine gültige Gleitkommazahl ist.

Der Algorithmus zur Wertbereinigung lautet wie folgt: Wenn der Wert des Elements keine gültige Gleitkommazahl ist , setzen Sie ihn stattdessen auf die leere Zeichenfolge.

Durch Angabe des Typs ( <input type="number">) fordern Sie den Browser auf, einige Arbeiten für Sie auszuführen. Wenn Sie andererseits in der Lage sein möchten, die nicht numerische Eingabe zu erfassen und etwas damit zu tun, müssen Sie sich auf das alte und bewährte Texteingabefeld verlassen und den Inhalt selbst analysieren.

Der W3 hat auch die gleichen Spezifikationen und fügt hinzu:

Benutzeragenten dürfen dem Benutzer nicht erlauben, den Wert auf eine nicht leere Zeichenfolge zu setzen, die keine gültige Gleitkommazahl ist.

j08691
quelle
6
Es wäre nützlich, wenn Benutzeragenten dem Benutzer nicht erlauben würden, den Wert auf eine nicht leere Zeichenfolge zu setzen, die keine gültige Gleitkommazahl ist. Aber wenn was sagt, kann es nicht getan werden; dann ist das die Antwort. Problemumgehung für meinen aktuellen Bedarf unten hinzugefügt.
Ian Boyd
57
Durch Angabe des Typs ( <input type="number">) fordern Sie den Browser auf, einige Arbeiten für Sie auszuführen. Persönlich habe ich nur mobile Browser gebeten, einen Ziffernblock anzuzeigen, und die Validierung als unangenehmes Extra erhalten. Die meisten dieser Probleme sind darauf zurückzuführen, dass das typeAttribut sowohl Validierungsregeln als auch Regeln für den anzuzeigenden Eingabemechanismus festlegt. Es ist jedoch durchaus möglich, mobilen Benutzern eine numerische Tastatur anzuzeigen, ohne dass die Nummernvalidierung auch auf Desktopbenutzer angewendet werden soll. HTML 5.1 wird dieses Problem zumindest mit dem inputmodeAttribut lösen .
Mark Amery
4
aber wenn der Browser nicht genug tut, möchte ich es vervollständigen können. B. Leerzeichen in der Eingabe entfernen, auf den Dezimalpunkt schließen ...
njzk2
1
Außerdem gibt es in verschiedenen Sprachen, wie z. B. Französisch, zwei Wörter für die Zahl. eine für Zahlen als Bezeichner wie Kreditkartennummern und eine zum Zählen von Zahlen wie Gleitkommazahlen.
NJZK2
1
@MotiKorets funktioniert nicht für die Eingabe von Gleitkommazahlen, da iPhones keinen Dezimalpunkt auf der Tastatur setzen. Leider sind Entwickler im Moment ziemlich durchgeknallt, was die Bereitstellung eines schönen Gleitkommaeintrags UX angeht ...
Andy
50

Die Frage wird nicht beantwortet, aber die nützliche Problemumgehung besteht darin, sie zu überprüfen

edQuantity.validity.valid

Das ValidityStateeines Objekts gibt Hinweise darauf, was der Benutzer eingegeben hat. Betrachten Sie eine type="number"Eingabe mit a minund maxset

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

Wir wollen immer verwenden .validity.valid.

Andere Eigenschaften geben nur Bonusinformationen:

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

Sie müssen sicherstellen, dass der Browser die HTML5-Validierung unterstützt, bevor Sie ihn verwenden:

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 hat eine nützliche Antwort, die er gelöscht hat:

Verwenden Sie dazu einfach den CSS- :invalidSelektor.

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

Dadurch wird Ihr Element rot, wenn eine nicht numerische Gültigkeit eingegeben wird.

Die Browser-Unterstützung für <input type='number'>ist ungefähr die gleiche wie :invalid, also kein Problem.

Lesen Sie mehr über :invalid hier .

Ian Boyd
quelle
Funktioniert nicht in Opera. Es heißt gültig, auch wenn Sie eine Zeichenfolge eingeben.
Bergi
Opera unterstützt die .validityEigenschaft, behandelt sie aber nicht richtig .valid?!
Ian Boyd
Es funktioniert, aber wann ist eine Zahleneingabe ungültig ? Es verhält sich einfach so, als wäre die Eingabe leer. A typeMismatchmag Sinn machen, aber das ist nur für E-Mail- oder URL-Typen…
Bergi
@Bergi Die obige Tabelle enthält Beispiele, bei denen Zahleneingaben ungültig sein können: "q", "11" (dann ist das Maximum 10), "0" (wenn das Minimum 1 ist), "" (dann ist das Element required)
Ian Boyd
1
@Bergi .badInputwurde am 20.11.2012 hinzugefügt . Aber niemand sollte nachsehen badInput, ob die Eingabe gültig ist. sie sollten schauen .valid. Es ist möglich (und richtig) .badInput, falsch zu sein und dennoch ungültige Eingaben zu haben. .validist definiert als das Fehlen von Validierungsfehlern (z. B. Fehlanpassungen, Überläufe, Unterläufe), von denen .badInputnur eine Art von Fehler vorliegt. Beachten Sie die obige Tabelle, in der .badInputfalse angegeben ist, die Eingabe jedoch weiterhin ungültig ist.
Ian Boyd
4

Verfolgen Sie alle gedrückten Tasten anhand ihrer Tastencodes

Ich nehme an, man könnte die Keyup-Ereignisse abhören und eine Reihe aller eingegebenen Zeichen basierend auf ihren Keycodes beibehalten. Aber es ist eine ziemlich mühsame Aufgabe und wahrscheinlich anfällig für Fehler.

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

Wählen Sie die Eingabe und erhalten Sie die Auswahl als Zeichenfolge

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

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

Alle Gutschriften an: int32_t

Sandstrom
quelle
Diese Lösung wurde an anderer Stelle ausprobiert und funktioniert nicht . Vor allem , wenn der Benutzer drückt Delete, Backspace, Ctrl+X, Ctrl+V, Right-click-cut, Right-click-paste.
Ian Boyd
Ich stimme Ihnen zu, im Grunde ist nicht möglich, was das OP gefragt hat. Beide von mir erwähnten Hacks (und sie sind Hacks, das bestreite ich nicht) funktionieren jedoch bis zu einem gewissen Grad. Vielleicht können sie in einigen Fällen für jemanden nützlich sein?
Sandstrom
Erstaunlicherweise scheint die Auswahlsache zu funktionieren. Was sind die Einschränkungen dieser Methode?
NJZK2
Einschränkungen: Der Text wird visuell ausgewählt. Wenn der Benutzer etwas
eingibt
Bearbeitet mit einer Live-Demo, die zeigt, wie schlecht diese Methode ist
vsync