Dadurch wird verhindert, dass eine negative Zahl mit den Pfeiltasten / dem Drehknopf eingegeben wird. Der Benutzer kann jedoch weiterhin manuell eine negative Zahl eingeben und den Wert dieses Felds als negative Zahl lesen lassen, wodurch das Attribut min umgangen wird.
Ecbrodie
52
@demaniak Nein. Und wie kam es, dass diese Antwort so viele positive Stimmen erhielt, wenn sie die Frage zur Hälfte beantwortete, ist ein Rätsel
GôTô
1
@Abraham Was passiert, wenn die Daten, die mit dem Wert -ve im Formular geladen wurden, nicht als rot markiert werden?
Kamini
2
Dies funktioniert nicht, der Benutzer kann dennoch manuell eine negative Zahl eingeben.
Es wurde nur verhindert, dass negative Zahlen über Aufwärts- / Abwärtspfeile eingegeben werden, während Benutzer negative Zahlen über die Tastatur eingeben können.
Die Lösung besteht darin, mit Schlüsselcode zu verhindern :
// Select your input element.var number = document.getElementById('number');// Listen for input event on numInput.
number.onkeydown =function(e){if(!((e.keyCode >95&& e.keyCode <106)||(e.keyCode >47&& e.keyCode <58)|| e.keyCode ==8)){returnfalse;}}
Upvoted, aber ich denke, es würde helfen zu klären, welche Schlüsselcodes überprüft werden:> 95, <106 entspricht Numpad 0 bis 9; > 47, <58 entspricht 0 bis 9 in der Zahlenreihe; und 8 ist Rücktaste. Dieses Skript verhindert also, dass Schlüssel außer denen eingegeben werden. Es ist gründlich, aber ich denke, es könnte für Browser, die von Haus aus Zahleneingaben unterstützen, die bereits alphabetische Tasten herausfiltern, übertrieben sein (mit Ausnahme von Zeichen wie "e", die eine numerische Bedeutung haben können). Es würde wahrscheinlich ausreichen, gegen 189 (Bindestrich) und 109 (Subtrahieren) zu verhindern. Und dann kombinieren mit min="0".
Hugh Guiney
1
@Manwal Das Kopieren und Einfügen von Zahlen über die Tastatur ist eingeschränkt. Und erlaubt mir, negative Zahlen mit der Maus einzufügen.
Beniton
1
@ Beniton Vielen Dank für diesen Anwendungsfall. Können Sie mir eine kleine Vorstellung davon geben, was Sie tun? Ich kann Ihnen immer helfen. Bitte geben Sie wenig ausführbaren Code oder Geige an. Sie können in Ihrem Code das Formular Submit Level Validation für haben. Obwohl ich immer im Backend einchecken muss, wenn ich keine negativen Zahlen zulasse.
Manwal
1
Einfach kopieren und in das Feld einfügen. Es ist nicht wirklich ein Sonderfall oder so. Anstatt die Validierung über den Schlüsselcode durchzuführen, ist es wahrscheinlich besser, sie auf Change oder focusOut durchzuführen und eine kleine Validierungsfunktion zu erstellen, um negative Zahlen abzufangen.
ulisesrmzroche
1
Die Bedingung für die Pfeiltaste (37, 38, 39, 41) sollte ebenfalls festgelegt werden. || (e.keyCode>36 && e.keyCode<41)Dadurch kann der Benutzer die Nummer nicht durch den Aufwärts- / Abwärtspfeil erhöhen / verringern und nach rechts / links gehen, um die Nummer zu bearbeiten.
Wirklich beste Lösung, wenn Sie Muster verwenden und mit Winkel nicht validieren, da das Modell nicht aktualisiert wird, wenn es nicht innerhalb des Bereichs liegt. Mein Fall:<input ng-model="row.myValue" type="{{row.code == 1 ? 'text' : 'number'}}" min="0" ng-pattern="..." noformvalidate oninput="if (this.type=='text') this.value=Math.abs(this.value) ">
Sebius
Dies funktioniert am besten, wenn der Benutzer weiß, dass der Standardwert 0 ist. Andere Benutzer sind verwirrt, wenn Sie die Rücktaste drücken und drücken, warum das Feld nicht gelöscht wird. Abgesehen davon ist es die beste Lösung. + 1
Deep 3015
1
Du hast meinen Tag gerettet
Stackmalux
Dieser funktioniert am besten und bei Verwendung von Dezimalstellen auch. Ich hatte oben eine andere Antwort verwendet, sie funktionierte nicht mehr, wenn Dezimalstellen zulässig sein sollen. Gibt es eine Möglichkeit, diese Antwort nach oben zu verschieben, damit die Leute sie meistens verwenden können?
Subhan Ahmed
31
Dieser Code funktioniert gut für mich. Können Sie es bitte überprüfen:
Dies funktioniert, aber das Leeren der gesamten Eingabe nach dem Versuch zu tippen -ist keine gute Idee.
Extempl
9
@extempl Klingt nach einer fairen Bestrafung für den Benutzer, der versucht, ein Negativ in ein Feld einzugeben, in dem der gesunde Menschenverstand angibt, dass es keine Negative gibt.
KhoPhi
3
<input type="number" name="test" min="0" oninput="validity.valid||(value=value.replace(/\D+/g, ''))">- Dies wird alle nicht-stelligen Symbole entfernen
Oleh Melnyk
@Rexford Ich stimme zu, aber ich habe min="0"so eingestellt , dass es keine Nagative gibt. Wenn Sie einen negativen Wert möchten, entfernen Sie dieses Attribut.
Chinmay235
1
Ich habe es versucht, aber es hat auch verhindert, dass Zahlen mit Dezimalstellen eingegeben werden.
Bitte denken Sie über den Tellerrand hinaus. Sind Sie wirklich sicher, dass a keypressdie einzige Möglichkeit ist, eine negative Zahl in eine Eingabe einzugeben ...
Roko C. Buljan
6
Die @ Mandal-Antwort ist gut, aber ich mag Code mit weniger Codezeilen für eine bessere Lesbarkeit. Außerdem verwende ich stattdessen gerne die Verwendung von onclick / onkeypress in HTML.
Dies funktioniert gut , WENN der Benutzer des Eingabefeldes konzentriert sich jedoch herausgestellt, wenn sie sofort drücken , während noch in dem Feld eingeben; Sie können immer noch eine negative Zahl eingeben.
NemyaNation
3
Hier ist eine Winkel-2-Lösung:
Erstellen Sie eine Klasse OnlyNumber
import{Directive,ElementRef,HostListener}from'@angular/core';@Directive({
selector:'[OnlyNumber]'})exportclassOnlyNumber{// Allow decimal numbers. The \. is only allowed once to occurprivate regex:RegExp=newRegExp(/^[0-9]+(\.[0-9]*){0,1}$/g);// Allow key codes for special events. Reflect :// Backspace, tab, end, homeprivate specialKeys:Array<string>=['Backspace','Tab','End','Home'];constructor(private el:ElementRef){}@HostListener('keydown',['$event'])
onKeyDown(event:KeyboardEvent){// Allow Backspace, tab, end, and home keysif(this.specialKeys.indexOf(event.key)!==-1){return;}// Do not use event.keycode this is deprecated.// See: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCodelet current:string=this.el.nativeElement.value;// We need this because the current value on the DOM element// is not yet updated with the value from this eventletnext:string= current.concat(event.key);if(next&&!String(next).match(this.regex)){event.preventDefault();}}}
Fügen Sie OnlyNumber zu Deklarationen in app.module.ts hinzu und verwenden Sie es so überall in Ihrer App
Während dieses Code-Snippet die Frage lösen kann, hilft eine Erklärung wirklich dabei, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
Sudheesh Singanamalla
Dies mag zwar die richtige Antwort sein, es fehlen jedoch genügend Details. Bitte erklären Sie, warum dies funktioniert. Bedenken Sie bei der Verwendung von Stack Overflow, dass dies eine lebendige Wissensbasis ist. Antworten, die kein Wissen teilen, sind weitaus weniger nützlich.
Marc LaFleur
2
Fügen Sie einfach eine andere Möglichkeit hinzu (mit Angular), wenn Sie den HTML-Code nicht mit noch mehr Code verschmutzen möchten:
Sie müssen nur das Feld valueChanges abonnieren und den Wert als absoluten Wert festlegen.
Die Antwort darauf ist nicht hilfreich. da es nur funktioniert, wenn Sie Auf- / Ab-Tasten verwenden, aber wenn Sie -11 eingeben, funktioniert es nicht. Also hier ist ein kleiner Fix, den ich benutze
Diese Lösung ermöglicht alle Tastaturfunktionen, einschließlich Kopieren und Einfügen mit der Tastatur. Es verhindert das Einfügen negativer Zahlen mit der Maus. Es funktioniert mit allen Browsern und der Demo auf Codepen verwendet Bootstrap und jQuery. Dies sollte mit nicht englischen Spracheinstellungen und Tastaturen funktionieren. Wenn der Browser die Erfassung von Einfügeereignissen (IE) nicht unterstützt, wird das negative Vorzeichen nach dem Ausschalten entfernt. Diese Lösung verhält sich wie der native Browser mit min = 0 type = number.
Antworten:
Verwenden Sie das
min
Attribut wie folgt:quelle
Ich war mit der Antwort von @Abhrabm nicht zufrieden , weil:
Die Lösung besteht darin, mit Schlüsselcode zu verhindern :
Klarstellung von @Hugh Guiney :
Welche Schlüsselcodes werden überprüft:
quelle
min="0"
.|| (e.keyCode>36 && e.keyCode<41)
Dadurch kann der Benutzer die Nummer nicht durch den Aufwärts- / Abwärtspfeil erhöhen / verringern und nach rechts / links gehen, um die Nummer zu bearbeiten.Für mich war die Lösung:
quelle
<input ng-model="row.myValue" type="{{row.code == 1 ? 'text' : 'number'}}" min="0" ng-pattern="..." noformvalidate oninput="if (this.type=='text') this.value=Math.abs(this.value) ">
Dieser Code funktioniert gut für mich. Können Sie es bitte überprüfen:
quelle
-
ist keine gute Idee.<input type="number" name="test" min="0" oninput="validity.valid||(value=value.replace(/\D+/g, ''))">
- Dies wird alle nicht-stelligen Symbole entfernenmin="0"
so eingestellt , dass es keine Nagative gibt. Wenn Sie einen negativen Wert möchten, entfernen Sie dieses Attribut.Einfache Methode:
quelle
Ich wollte Dezimalzahlen zulassen und nicht die gesamte Eingabe löschen, wenn ein Negativ eingegeben wurde. Dies funktioniert zumindest in Chrom gut:
quelle
keypress
die einzige Möglichkeit ist, eine negative Zahl in eine Eingabe einzugeben ...Die @ Mandal-Antwort ist gut, aber ich mag Code mit weniger Codezeilen für eine bessere Lesbarkeit. Außerdem verwende ich stattdessen gerne die Verwendung von onclick / onkeypress in HTML.
Meine vorgeschlagene Lösung macht dasselbe: Hinzufügen
zur HTML-Eingabe und
als Javascript-Funktion.
Wie gesagt, es macht das gleiche. Es ist nur eine persönliche Präferenz, wie das Problem gelöst werden soll.
quelle
Nur als Referenz: Mit jQuery können Sie negative Werte auf focusout mit dem folgenden Code überschreiben:
Dies ersetzt nicht die serverseitige Validierung!
quelle
Hier ist eine Winkel-2-Lösung:
Erstellen Sie eine Klasse OnlyNumber
Fügen Sie OnlyNumber zu Deklarationen in app.module.ts hinzu und verwenden Sie es so überall in Ihrer App
quelle
quelle
Fügen Sie einfach eine andere Möglichkeit hinzu (mit Angular), wenn Sie den HTML-Code nicht mit noch mehr Code verschmutzen möchten:
Sie müssen nur das Feld valueChanges abonnieren und den Wert als absoluten Wert festlegen.
HTML QUELLTEXT
TypeScript CODE (in Ihrer Komponente)
quelle
quelle
Die Antwort darauf ist nicht hilfreich. da es nur funktioniert, wenn Sie Auf- / Ab-Tasten verwenden, aber wenn Sie -11 eingeben, funktioniert es nicht. Also hier ist ein kleiner Fix, den ich benutze
dieser für ganze Zahlen
Dieser, wenn Sie Preisnummern haben
quelle
Diese Lösung ermöglicht alle Tastaturfunktionen, einschließlich Kopieren und Einfügen mit der Tastatur. Es verhindert das Einfügen negativer Zahlen mit der Maus. Es funktioniert mit allen Browsern und der Demo auf Codepen verwendet Bootstrap und jQuery. Dies sollte mit nicht englischen Spracheinstellungen und Tastaturen funktionieren. Wenn der Browser die Erfassung von Einfügeereignissen (IE) nicht unterstützt, wird das negative Vorzeichen nach dem Ausschalten entfernt. Diese Lösung verhält sich wie der native Browser mit min = 0 type = number.
Markup:
Javascript
quelle
Hier ist eine Lösung, die für ein QTY-Feld, das nur Zahlen zulässt, am besten funktioniert hat.
quelle
quelle