Warum erlaubt die HTML-Eingabe mit dem Typ "Nummer" die Eingabe des Buchstabens "e" in das Feld?

216

Ich habe das folgende HTML5-Eingabeelement:

<input type="number">

Warum ermöglicht diese Eingabe die Eingabe des Zeichens 'e' in das Eingabefeld? Es kann kein anderes Alphabetzeichen eingegeben werden (wie erwartet)

Verwenden von Chrome v. 44.0.2403.107

Um zu sehen, was ich meine: http://www.w3schools.com/html/tryit.asp?filename=tryhtml_input_number

Gnarlywal
quelle
3
.In einigen Browsern können Sie außerdem +, - und mehrmals eingeben .
Nu Everest

Antworten:

216

Denn genau so sagt die Spezifikation, dass es funktionieren sollte. Die Zahleneingabe kann Gleitkommazahlen akzeptieren , einschließlich negativer Symbole und des Zeichens eoder E(wobei der Exponent die Zahl nach dem eoder ist E):

Eine Gleitkommazahl besteht aus den folgenden Teilen in genau der folgenden Reihenfolge:

  1. Optional kann das erste Zeichen ein " -" Zeichen sein.
  2. Ein oder mehrere Zeichen im Bereich " 0—9".
  3. Optional die folgenden Teile in genau der folgenden Reihenfolge:
    1. ein " ." Zeichen
    2. ein oder mehrere Zeichen im Bereich " 0—9"
  4. Optional die folgenden Teile in genau der folgenden Reihenfolge:
    1. ein " e" Zeichen oder " E" Zeichen
    2. optional ein " -" Zeichen oder " +" Zeichen
    3. Ein oder mehrere Zeichen im Bereich " 0—9".
j08691
quelle
2
Ah danke. Ich habe in der falschen Spezifikation
gesucht
4
Ich bin immer noch verblüfft darüber, zunächst einmal bin ich kein Mathematiker. Wofür steht "e" im Kontext einer Zahl? Zweitens verstehe ich nicht, warum input.value eine leere Zeichenfolge ist, sobald Sie ein "e" darin schreiben, obwohl es Zahlen gibt und das Zeichen erlaubt ist ...
Simon
9
@Simon, die Verwendung von eist nützlich, um große Zahlen zu komprimieren, deren Eingabe sonst mühsam wäre. Als triviales Beispiel2e2 = 2*10^2 = 200
Gnarlywhale
3
@ Simon "sobald ich e schreibe" , na ja, "4e" ist keine Zahl, während zum Beispiel "4e + 0" eine gültige Zahl ist (4). Wenn Sie einen "live" clientseitigen Javascript-Code haben, der mit teilweisen Benutzereingaben arbeitet, müssen Sie dem Benutzer Zeit geben, um die Eingabebearbeitung abzuschließen, um den vollen Wert zu erzielen, und nicht die Hälfte der Bearbeitung stören. Wenn Sie "undefiniert" von "4e + 0" eingegeben haben, korrigieren Sie Ihren Parser "to number". Das Beispiel aus Frage funktioniert gut, meldet "4e + 1" als Fehler und "4e + 0" wird korrekt als "4e + 0" zurückgegeben (dh Zahl zwischen 1 und 5).
Ped7g
4
@Anthony Nein, esteht für Exponent.
Scott Marcus
62

Wir können es so einfach machen wie unten

<input type="number"  onkeydown="javascript: return event.keyCode == 69 ? false : true" />

Aktualisierte Antwort

Wir können es noch einfacher machen, wie @ 88 MPG vorschlägt

<input type="number" onkeydown="return event.keyCode !== 69" />

Codegeek
quelle
17
Besser zu verwenden, return event.keyCode !== 69da unnötige ternäre Operatoren vermieden werden. Auch würde Inlining nicht empfehlen.
Adam Fratino
5
Dies verhindert jedoch nicht das Einfügen von Kopien eoder Eim Feld
Molamk
18

Der Typ der HTML-Eingabenummer erlaubt "e / E", da "e" für Exponential steht, das ein numerisches Symbol ist.

Beispiel 200000 kann auch als 2e5 geschrieben werden. Ich hoffe, das hilft Ihnen, sich für die Frage zu bedanken.          

Anon Cypher
quelle
12

Der beste Weg , um die Verwendung einer Zahl zu erzwingen, die nur aus Ziffern besteht:

<input type="number" onkeydown="javascript: return event.keyCode === 8 ||
event.keyCode === 46 ? true : !isNaN(Number(event.key))" />

Dies vermeidet 'e', ​​'-', '+', '.' ... alle Zeichen, die keine Zahlen sind!

So erlauben Sie nur Zifferntasten:

isNaN (Nummer (event.key))

aber akzeptiere "Backspace" (keyCode: 8) und "Delete" (keyCode: 46) ...

A. Morel
quelle
11
<input type="number" onkeydown="return FilterInput(event)" onpaste="handlePaste(event)"  >

function FilterInput(event) {
    var keyCode = ('which' in event) ? event.which : event.keyCode;

    isNotWanted = (keyCode == 69 || keyCode == 101);
    return !isNotWanted;
};
function handlePaste (e) {
    var clipboardData, pastedData;

    // Get pasted data via clipboard API
    clipboardData = e.clipboardData || window.clipboardData;
    pastedData = clipboardData.getData('Text').toUpperCase();

    if(pastedData.indexOf('E')>-1) {
        //alert('found an E');
        e.stopPropagation();
        e.preventDefault();
    }
};
Wahrheitssucher
quelle
2
Wie sicher sind Sie, dass dies das Einfügen eines 'E'-Zeichens mit der Funktion zum Kopieren und Einfügen verhindert?
StephenKelzer
1
Nur überprüft, Sie sind richtig, es funktioniert nicht für das Kopieren und Einfügen von Eingaben.
Gnarlywhale
Sie sind richtig @StephenKelzer. Ich habe Code hinzugefügt, um das zu handhaben.
TruthSeeker
4

Um sowohl Buchstaben eals auch Minuszeichen auszublenden, -gehen Sie einfach wie folgt vor:

onkeydown="return event.keyCode !== 69 && event.keyCode !== 189"
Austris Cirulnieks
quelle
3

Mit Winkel können Sie dies einschränken, um die Eingabe von e, +, -, E einzuschränken

 <input type="number"  (keypress)="numericOnly($event)"/>


  numericOnly(event): boolean { // restrict e,+,-,E characters in  input type number
    debugger
    const charCode = (event.which) ? event.which : event.keyCode;
    if (charCode == 101 || charCode == 69 || charCode == 45 || charCode == 43) {
      return false;
    }
    return true;

  }
Rinku Choudhary
quelle
2
Dies wird den Benutzer einschränken, dieses Zeichen einzugeben?
Amy
1
Vielen Dank für die Hilfe Ich suchte nach der gleichen Lösung in Angular, aber jetzt habe ich eine Idee, wie es geht. Ich werde eine Direktive erstellen und die Aufgabe erledigen. Danke für Ihren Beitrag
Amy
Sie können die Richtlinie erstellen, die als Best Practice gilt. Sie können dies auch direkt in der .ts-Datei Ihrer Komponente tun!
Rinku Choudhary
0

Winkelig; mit IDE keyCode veraltete Warnung

Funktionell identisch mit der Antwort von rinku, jedoch mit Verhinderung der IDE-Warnung

numericOnly(event): boolean {
    // noinspection JSDeprecatedSymbols
    const charCode = (event.which) ? event.which : event.key || event.keyCode;  // keyCode is deprecated but needed for some browsers
    return !(charCode === 101 || charCode === 69 || charCode === 45 || charCode === 43);
}
Simon Legg
quelle