HTML-Texteingabe erlaubt nur numerische Eingabe


852

Gibt es eine schnelle Möglichkeit, eine HTML-Texteingabe ( <input type=text />) so einzustellen , dass nur numerische Tastenanschläge (plus '.') Erlaubt werden?


81
Viele Lösungen funktionieren hier nur, wenn Tasten gedrückt werden. Diese schlagen fehl, wenn Benutzer Text über das Menü einfügen oder Text per Drag & Drop in die Texteingabe ziehen. Das hat mich schon mal gebissen. Achtung!
Bennett McElwee

83
@JuliusA - Sie immer immer sowieso serverseitige Validierung benötigen.
Stephen P

46
<input type="text" onkeypress='return event.charCode >= 48 && event.charCode <= 57'></input>
Droogans

14
@Droogans bemerken, dass auch andere Tasten wie TAB deaktiviert werden, um zur nächsten Eingabe zu gelangen, oder andere Verknüpfungen, die nicht direkt mit Eingaben wie cmd + R verbunden sind, um die Website zu aktualisieren, wenn die Eingabe fokussiert ist.
Alejandro Pérez

1
Wenn Sie mit dem Plugin einverstanden sind, verwenden Sie NumericInput. Demo: jsfiddle.net/152sumxu/2 Weitere Details hier stackoverflow.com/a/27561763/82961
Faiz

Antworten:


1137

Hinweis: Dies ist eine aktualisierte Antwort. Die folgenden Kommentare beziehen sich auf eine alte Version, die mit Schlüsselcodes herumgespielt hat.

JavaScript

Probieren Sie es selbst auf JSFiddle .

Sie können die Eingabewerte eines Textes <input>mit der folgenden setInputFilterFunktion filtern (unterstützt Kopieren + Einfügen, Ziehen + Ablegen, Tastaturkürzel, Kontextmenüoperationen, nicht typisierbare Tasten, die Caret-Position, verschiedene Tastaturlayouts und alle Browser seit IE 9 ). ::

// Restricts input for the given textbox to the given inputFilter function.
function setInputFilter(textbox, inputFilter) {
  ["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop"].forEach(function(event) {
    textbox.addEventListener(event, function() {
      if (inputFilter(this.value)) {
        this.oldValue = this.value;
        this.oldSelectionStart = this.selectionStart;
        this.oldSelectionEnd = this.selectionEnd;
      } else if (this.hasOwnProperty("oldValue")) {
        this.value = this.oldValue;
        this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
      } else {
        this.value = "";
      }
    });
  });
}

Mit der setInputFilterFunktion können Sie jetzt einen Eingabefilter installieren:

setInputFilter(document.getElementById("myTextBox"), function(value) {
  return /^\d*\.?\d*$/.test(value); // Allow digits and '.' only, using a RegExp
});

Weitere Beispiele für Eingabefilter finden Sie in der JSFiddle-Demo . Beachten Sie auch, dass Sie noch eine serverseitige Validierung durchführen müssen!

Typoskript

Hier ist eine TypeScript-Version davon.

function setInputFilter(textbox: Element, inputFilter: (value: string) => boolean): void {
    ["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop"].forEach(function(event) {
        textbox.addEventListener(event, function(this: (HTMLInputElement | HTMLTextAreaElement) & {oldValue: string; oldSelectionStart: number | null, oldSelectionEnd: number | null}) {
            if (inputFilter(this.value)) {
                this.oldValue = this.value;
                this.oldSelectionStart = this.selectionStart;
                this.oldSelectionEnd = this.selectionEnd;
            } else if (Object.prototype.hasOwnProperty.call(this, 'oldValue')) {
                this.value = this.oldValue;
                if (this.oldSelectionStart !== null &&
                    this.oldSelectionEnd !== null) {
                    this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
                }
            } else {
                this.value = "";
            }
        });
    });
}

jQuery

Es gibt auch eine jQuery-Version davon. Siehe diese Antwort .

HTML 5

HTML 5 bietet eine native Lösung mit <input type="number">(siehe Spezifikation ). Beachten Sie jedoch, dass die Browserunterstützung unterschiedlich ist:

  • Die meisten Browser überprüfen die Eingabe nur beim Senden des Formulars und nicht beim Eingeben.
  • Die meisten mobilen Browser unterstützen nicht die step, minund maxAttribute.
  • In Chrome (Version 71.0.3578.98) kann der Benutzer weiterhin die Zeichen eund Edas Feld eingeben . Siehe auch diese Frage .
  • Mit Firefox (Version 64.0) und Edge (EdgeHTML Version 17.17134) kann der Benutzer weiterhin beliebigen Text in das Feld eingeben .

Probieren Sie es selbst auf w3schools.com .


4
Obwohl dies eine gute Wahl wäre, können dennoch Zeichen wie /, mehrere Punkte, andere Operatoren usw. eingegeben werden
Mahendra Liya

6
Immer noch nicht von Firefox 21 unterstützt (ich
spreche

67
Die Eingabetypnummer ist nicht dazu gedacht, dass Ihre Eingabe nur Zahlen akzeptiert. Es ist für Eingaben gedacht, die eine 'Anzahl von Elementen' angeben. Chrome fügt beispielsweise zwei kleine Pfeile hinzu, um die Anzahl um eins zu erhöhen oder zu verringern. Eine richtige Eingabe nur mit Zahlen ist eine Art lächerliches Auslassen von HTML.
Erwin

9
Der Typ = "Nummer" verhindert nicht, dass ungültiger Text in das Feld eingegeben wird. Es scheint, dass Sie sogar Mülldaten ausschneiden und in das Feld einfügen können, sogar in Chrom.
Perfektionist

6
Das einzige, was ich hinzufügen möchte, ist, die Strg + A-Zeile so zu ändern, dass sie MacOSX-Benutzer enthält:(e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true))
MForMarlon

281

Verwenden Sie dieses DOM

<input type='text' onkeypress='validate(event)' />

Und dieses Skript

function validate(evt) {
  var theEvent = evt || window.event;

  // Handle paste
  if (theEvent.type === 'paste') {
      key = event.clipboardData.getData('text/plain');
  } else {
  // Handle key press
      var key = theEvent.keyCode || theEvent.which;
      key = String.fromCharCode(key);
  }
  var regex = /[0-9]|\./;
  if( !regex.test(key) ) {
    theEvent.returnValue = false;
    if(theEvent.preventDefault) theEvent.preventDefault();
  }
}

12
deutsche einstellungen auf einem eeepc 900. einige schlüssel für eine gute benutzerfreundlichkeit funktionieren nicht: - rücktaste (keyCode: 8) - navigationstaste links und rechts (keyCode: 37, 38) kopieren und einfügen ist ebenfalls möglich ...
Michael Piendl

11
Die meisten Leute kümmern sich darum, dass ein Skriptfehler auf Ihrer Website schlecht angezeigt wird.
Robert Jeppesen

14
Einige Probleme mit diesem Code. Sie können eingeben. mehr als einmal, zweitens erlaubt es nicht, Schlüssel zu löschen, irgendeine Lösung?
coure2011

4
Ich habe mich um Rücktaste, Löschen und nicht funktionierende Pfeile gekümmert. Wenn Sie "theEvent.keycode ||" entfernen und hinzufügen: "if (/ [- ~] / &&! Regex.test (key)) {", funktioniert es besser (für ASCII / UTF sowieso). Aber dann werden chinesische Schriftzeichen nicht abgelehnt! :)
Sam Watkins

4
Dies ermöglicht es jemandem, zufällige
Dinge

137

Ich habe lange und intensiv nach einer guten Antwort darauf gesucht, und wir brauchen dringend <input type="number", aber kurz gesagt, diese beiden sind die prägnantesten Möglichkeiten, die ich finden könnte:

<input type="text" 
       onkeyup="this.value=this.value.replace(/[^\d]/,'')">

Wenn Sie das nicht akzeptierte Zeichen, das vor dem Löschen für den Bruchteil einer Sekunde angezeigt wird, nicht mögen, ist die folgende Methode meine Lösung. Beachten Sie die zahlreichen zusätzlichen Bedingungen, um zu vermeiden, dass alle Arten von Navigation und Hotkeys deaktiviert werden. Wenn jemand weiß, wie man das verdichtet, lass es uns wissen!

<input type="text" 
onkeydown="return ( event.ctrlKey || event.altKey 
                    || (47<event.keyCode && event.keyCode<58 && event.shiftKey==false) 
                    || (95<event.keyCode && event.keyCode<106)
                    || (event.keyCode==8) || (event.keyCode==9) 
                    || (event.keyCode>34 && event.keyCode<40) 
                    || (event.keyCode==46) )">

4
input type = "number" kommt in HTML 5 - und Sie können JavaScript als Ersatz
Fenton

5
Gute Methode, kann aber durch Drücken und Halten einer nicht akzeptablen Taste gebrochen werden
Scott Brown

8
Ändern Sie die Regex in /[^\d+]/und es funktioniert mit Niederhalten
Boecko

11
@boecko danke dafür, aber beachte, dass es /[^\d]+/stattdessen sein sollte. Gute Lösung. Also @ user235859
Mosselman

11
Er wollte auch erlauben .. Sie sollten es tatsächlich schaffen/[^0-9.]/g
Qsario

93

Hier ist eine einfache, die genau eine Dezimalstelle zulässt, aber nicht mehr:

<input type="text" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" />


12
Handles: Kopieren + Einfügen, Ziehen und Ablegen, erlaubt nur 1 Dezimalstelle, Tabulator, Löschen, Rücktaste - verwenden Sie diese
Mathemats

Kann diese Logik innerhalb eines Eingangs extrahiert werden, damit sie global verwendet werden kann?
ema

@ema - ja, siehe meine andere Antwort hier, die zeigt, wie Sie die Regel mit class anwenden können.
Billynoah

Wenn Sie dies für Winkelformulare verwenden, wird der Wert im Formularsteuerungswert nicht aktualisiert.
Ale_info

Genial. Ich ändere das Ereignis in this.value = this.value.replace (/ [^ 0-9 .-] / g, '') .replace (/(\..*)\./ g, '$ 1'). ersetzen (/ ^ 0 + / g, ''). ersetzen (/ (? <! ^) - / g, ''); Auf diese Weise wird nur ein - am Anfang behandelt und es werden keine Nullen am Anfang der Zahl zugelassen.
17.

54

Und noch ein Beispiel, das für mich großartig funktioniert:

function validateNumber(event) {
    var key = window.event ? event.keyCode : event.which;
    if (event.keyCode === 8 || event.keyCode === 46) {
        return true;
    } else if ( key < 48 || key > 57 ) {
        return false;
    } else {
        return true;
    }
};

Auch an Tastendruckereignis anhängen

$(document).ready(function(){
    $('[id^=edit]').keypress(validateNumber);
});

Und HTML:

<input type="input" id="edit1" value="0" size="5" maxlength="5" />

Hier ist ein jsFiddle-Beispiel


Was ist mit eingefügtem Text?
Jason Ebersey

Warum erhalte ich "Ereignis ist undefiniert", wenn ich diese Funktion aufrufe?
Vincent

1
Dies funktioniert in Firefox nicht, wenn der event.keyCode immer 0 zurückgegeben wird. Ich habe mit neuem Code behoben: function validateNumber (event) {var key = event.which || event.charCode || event.keyCode || 0; if (key == 8 || key == 46 || key == 37 || key == 39) {return true; } else if (Schlüssel <48 || Schlüssel> 57) {return false; } return true; };
Luan Nguyen

1
Wie @Jessica sagte, können Sie Apostroph und sogar Prozentzeichen hinzufügen.
Alejandro Nava

1
Sehr nah! erlaubt aber mehr als eine Dezimalstelle.
Kross

52

HTML5 hat <input type=number>, was für Sie richtig klingt. Derzeit wird es nur von Opera nativ unterstützt, es gibt jedoch ein Projekt mit einer JavaScript-Implementierung.


In diesem Dokument wird definiert, welche Browser dieses Attribut unterstützen: caniuse.com/input-number . Zum jetzigen Zeitpunkt unterstützen Chrome und Safari dieses Typfeld vollständig. IE 10 hat teilweise Unterstützung und Firefox hat keine Unterstützung.
Nathan Wallace

Das einzige Problem dabei type=numberist, dass IE9
J Rod

@JRod Es gibt eine Polyfüllung für den alten IE. Mehr Infos hier .
JKDEV

6
Das erste Problem besteht type=numberdarin, das eZeichen zuzulassen, da es e+10als Zahl betrachtet wird. Das zweite Problem ist, dass Sie die maximale Anzahl von Zeichen in der Eingabe nicht begrenzen können.
Hakan Fıstık

Ein weiteres Problem ist, dass ich, wenn der Typ eine Nummer ist, die Vorteile einer Einstellung des Typs nicht nutzen kann, zum Beispiel: "tel".
ScottyBlades

49

Die meisten Antworten hier haben alle die Schwäche, Schlüsselereignisse zu verwenden .

Viele der Antworten würden Ihre Fähigkeit zur Textauswahl mit Tastaturmakros, Kopieren + Einfügen und unerwünschtem Verhalten einschränken, andere scheinen von bestimmten jQuery-Plugins abhängig zu sein, die Fliegen mit Maschinengewehren töten.

Diese einfache Lösung scheint für mich plattformübergreifend am besten zu funktionieren, unabhängig vom Eingabemechanismus (Tastenanschlag, Kopieren + Einfügen, Rechtsklick Kopieren + Einfügen, Sprache-zu-Text usw.). Alle Textauswahl-Tastaturmakros würden weiterhin funktionieren und sogar die Möglichkeit einschränken, einen nicht numerischen Wert per Skript festzulegen.

function forceNumeric(){
    var $input = $(this);
    $input.val($input.val().replace(/[^\d]+/g,''));
}
$('body').on('propertychange input', 'input[type="number"]', forceNumeric);

jQuery 1.7+ benötigt. Dies ist eine vollständigere Antwort, da Eingaben über "Kopieren" berücksichtigt werden. Und es ist auch einfacher!
Memochipan

Eine alternative Regex: replace(/[^\d]+/g,'')Ersetzen Sie alle nicht- stelligen Zeichen durch eine leere Zeichenfolge. Der Modifikator "i" (ohne Berücksichtigung der Groß- und Kleinschreibung) wird nicht benötigt.
Memochipan

Dies sollte oben sein, da "onkey" -Ereignishandler in einem Tag nicht mehr weitergegeben werden sollten ...
gpinkas

Dies ist definitiv die beste Antwort hier, aber es erlaubt keine Ziffern mit Dezimalzahlen. Irgendeine Idee, wie das funktionieren könnte?
Atirag

6
@ Atirag Wenn Sie Dezimalstellen möchten, können Sie den /[^\d,.]+/
regulären Ausdruck

41

Ich habe mich für eine Kombination der beiden hier genannten Antworten entschieden, d. H.

<input type="number" />

und

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : evt.keyCode
    return !(charCode > 31 && (charCode < 48 || charCode > 57));
}

<input type="text" onkeypress="return isNumberKey(event);">


Hervorragende Antwort ... +1. Sie können die if-Anweisung auch auf return !(charCode > 31 && (charCode < 48 || charCode > 57));
Folgendes

7
Wie wäre es aber mit Löschen? Sie möchten Zahlen, aber Sie möchten wahrscheinlich, dass die Leute sie korrigieren können, ohne die Seite zu
aktualisieren

40

HTML5 unterstützt reguläre Ausdrücke, sodass Sie Folgendes verwenden können:

<input id="numbersOnly" pattern="[0-9.]+" type="text">

Warnung: Einige Browser unterstützen dies noch nicht.


7
HTML5 hat auch <input type=number>.
Mathias Bynens

Wahr. Sie sollten dies zu einer Antwort machen. Hoppla, @ Ms2ger hat bereits.
James.garriss

Die <Eingabe Typ = Nummer> fügt Pfeile zum Erhöhen und Verringern in bestimmten Browsern hinzu, so dass dies eine gute Lösung zu sein scheint, wenn wir den Spinner vermeiden wollen
Ayrad

35
Das Muster wird nur beim Senden überprüft. Sie können weiterhin Buchstaben eingeben.
Erwin

Was bedeutet das +Musterattribut?
PlanetHackers

18

JavaScript

function validateNumber(evt) {
    var e = evt || window.event;
    var key = e.keyCode || e.which;

    if (!e.shiftKey && !e.altKey && !e.ctrlKey &&
    // numbers   
    key >= 48 && key <= 57 ||
    // Numeric keypad
    key >= 96 && key <= 105 ||
    // Backspace and Tab and Enter
    key == 8 || key == 9 || key == 13 ||
    // Home and End
    key == 35 || key == 36 ||
    // left and right arrows
    key == 37 || key == 39 ||
    // Del and Ins
    key == 46 || key == 45) {
        // input is VALID
    }
    else {
        // input is INVALID
        e.returnValue = false;
        if (e.preventDefault) e.preventDefault();
    }
}

zusätzlich können Sie Komma, Punkt und Minus (, .-) hinzufügen

  // comma, period and minus, . on keypad
  key == 190 || key == 188 || key == 109 || key == 110 ||

HTML

<input type="text" onkeydown="validateNumber(event);"/ >

Funktioniert nicht richtig auf Tastaturen, bei denen die Umschalttaste zur Eingabe einer Nummer verwendet werden muss (z. B. European AZERTY-Tastatur).
Captain Sensible

Danke Mann, du verstehst wirklich eine Frage! Schönes Beispiel und Off-Course-Handling. oder (was die meisten Leute wollen, wenn sie mit Zahlen arbeiten)
real_yggdrasil

Dies ist die einzige Funktion, die das Einfügen nicht numerischer Werte verhindert.
DEREK LEE

16

So einfach....

// In einer JavaScript-Funktion (kann HTML oder PHP verwenden).

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : evt.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}

In Ihrer Formulareingabe:

<input type=text name=form_number size=20 maxlength=12 onkeypress='return isNumberKey(event)'>

Mit Eingang max. (Diese oben erlaubt eine 12-stellige Nummer)


Tu das nicht! Dies blockiert alles, Nummernblock, Pfeiltasten, Entf-Taste, Tastenkombinationen (z. B. STRG + A, STRG + R zum Beispiel), sogar die TAB-Taste ist WIRKLICH ärgerlich!
Korri

@Korri Ich folge nicht, was scheint das Problem zu sein? In meinem Fall hat es gut funktioniert.
uneakharsh

Die erste Zeile muss geändert werden in:var charCode = (evt.which) ? evt.which : evt.keyCode;
Peiman F.

15

2 Lösungen:

Verwenden Sie einen Formularvalidator (zum Beispiel mit dem jQuery-Validierungs-Plugin ).

Führen Sie eine Überprüfung während des Ereignisses onblur (dh wenn der Benutzer das Feld verlässt) des Eingabefelds mit dem regulären Ausdruck durch:

<script type="text/javascript">
function testField(field) {
    var regExpr = new RegExp("^\d*\.?\d*$");
    if (!regExpr.test(field.value)) {
      // Case of error
      field.value = "";
    }
}

</script>

<input type="text" ... onblur="testField(this);"/>

Interessanterweise musste ich den regulären Ausdruck "^ \\ d \\.? \\ d * $" angeben, aber das könnte daran liegen, dass die Seite eine XSLT-Transformation durchläuft.
Paul Tomblin

Ich denke, der reguläre Ausdruck ist falsch. Ich habe diese Zeile verwendet:var regExpr = /^\d+(\.\d*)?$/;
Costa

@costa nicht sicher, ob der Benutzer zum Beispiel .123(statt 0.123) eingeben möchte ?
Romain Linsolas

@romaintaz. Sie haben Recht, aber dann müssten Sie den regulären Ausdruck ändern, um sicherzustellen, dass nach dem Punkt Ziffern stehen, falls keine Ziffer vor dem Punkt steht. So etwas wie das : var regExpr = /^\d+(\.\d*)?$|^\.\d+$/;.
Costa

14

Ein sicherer Ansatz besteht darin, den Wert der Eingabe zu überprüfen, anstatt Tastendrücke zu entführen und zu versuchen, keyCodes zu filtern.

Auf diese Weise kann der Benutzer Tastaturpfeile, Modifizierertasten, Rücktaste, Löschen, nicht standardmäßige Tastaturen verwenden, mit der Maus einfügen, Text per Drag & Drop verwenden und sogar Eingabehilfen verwenden.

Das folgende Skript erlaubt positive und negative Zahlen

1
10
100.0
100.01
-1
-1.0
-10.00
1.0.0 //not allowed

var input = document.getElementById('number');
input.onkeyup = input.onchange = enforceFloat;

//enforce that only a float can be inputed
function enforceFloat() {
  var valid = /^\-?\d+\.\d*$|^\-?[\d]*$/;
  var number = /\-\d+\.\d*|\-[\d]*|[\d]+\.[\d]*|[\d]+/;
  if (!valid.test(this.value)) {
    var n = this.value.match(number);
    this.value = n ? n[0] : '';
  }
}
<input id="number" value="-3.1415" placeholder="Type a number" autofocus>

EDIT: Ich habe meine alte Antwort entfernt, weil ich denke, dass sie jetzt veraltet ist.


Dies scheint in der Tat die meisten Fälle abzudecken
Zia Ul Rehman Mughal


13

Nachfolgend finden Sie die genannte Lösung. In diesen Benutzer in der Lage sein , können nur eingeben numericWert, kann auch Benutzer nicht in der Lage sein copy, paste, dragund dropin der Eingabe.

Zulässige Zeichen

0,1,2,3,4,5,6,7,8,9

Nicht erlaubte Charaktere und Charaktere durch Ereignisse

  • Alphabetischer Wert
  • Spezielle Charaktere
  • Kopieren
  • Einfügen
  • Ziehen
  • Fallen

$(document).ready(function() {
  $('#number').bind("cut copy paste drag drop", function(e) {
      e.preventDefault();
  });     
});
function isNumberKey(evt) {
    var charCode = (evt.which) ? evt.which : evt.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" class="form-control" name="number" id="number" onkeypress="return isNumberKey(event)" placeholder="Enter Numeric value only">

Lassen Sie mich wissen, wenn es nicht funktioniert.


11

Wenn Sie dem Gerät (möglicherweise einem Mobiltelefon) einen Vorschlag zwischen alphanumerisch oder numerisch vorschlagen möchten, können Sie diesen verwenden <input type="number">.


11

Ein weiteres Beispiel , wo Sie können nur Zahlen in das Eingabefeld hinzufügen, können nicht Buchstaben

<input type="text" class="form-control" id="phone" name="phone" placeholder="PHONE" spellcheck="false" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');">

10

Eine kurze und süße Implementierung mit jQuery und replace (), anstatt event.keyCode oder event.which zu betrachten:

$('input.numeric').live('keyup', function(e) {
  $(this).val($(this).val().replace(/[^0-9]/g, ''));
});

Nur kleiner Nebeneffekt, dass der getippte Buchstabe kurz erscheint und STRG / CMD + A sich etwas seltsam zu verhalten scheint.


9

input type="number" ist ein HTML5-Attribut.

Im anderen Fall hilft Ihnen dies:

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : evt.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}

<input type="number" name="somecode" onkeypress="return isNumberKey(event)"/>

Die erste Zeile muss geändert werden in:var charCode = (evt.which) ? evt.which : evt.keyCode;
Peiman F.

9

JavaScript-Code:

function validate(evt)
{
    if(evt.keyCode!=8)
    {
        var theEvent = evt || window.event;
        var key = theEvent.keyCode || theEvent.which;
        key = String.fromCharCode(key);
        var regex = /[0-9]|\./;
        if (!regex.test(key))
        {
            theEvent.returnValue = false;

            if (theEvent.preventDefault)
                theEvent.preventDefault();
            }
        }
    }

HTML Quelltext:

<input type='text' name='price' value='0' onkeypress='validate(event)'/>

funktioniert perfekt, da der Backspace-Schlüsselcode 8 ist und ein Regex-Ausdruck dies nicht zulässt, sodass der Fehler auf einfache Weise umgangen werden kann :)


9

Eine einfache Möglichkeit, dieses Problem zu beheben, besteht darin, eine jQuery-Funktion zu implementieren, um die in das Textfeld eingegebenen Zeichen mit Regex zu überprüfen. Beispiel:

Ihr HTML-Code:

<input class="integerInput" type="text">

Und die js-Funktion mit jQuery

$(function() {
    $('.integerInput').on('input', function() {
      this.value = this.value
        .replace(/[^\d]/g, '');// numbers and decimals only

    });
});

$(function() {
        $('.integerInput').on('input', function() {
          this.value = this.value
            .replace(/[^\d]/g, '');// numbers and decimals only
            
        });
    });
<script
			  src="https://code.jquery.com/jquery-2.2.4.min.js"
			  integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="
			  crossorigin="anonymous">
</script>

<input type="text" class="integerInput"/>


		


8

Nur eine andere Variante mit jQuery

$(".numeric").keypress(function() {
    return (/\d/.test(String.fromCharCode(event.which) ))
});

8

Verwenden Sie jetzt type = "number". Dieses Attribut wird in den meisten Browsern unterstützt

<input type="number" maxlength="3" ng-bind="first">

Ich habe nicht überprüft, ob die Daten --1(2 minus Zeichen vor 1) sind.
Ngoc Nam

6

Sie können auch den Eingabewert (der standardmäßig als Zeichenfolge behandelt wird) mit sich selbst vergleichen, der als numerisch erzwungen wird, z.

if(event.target.value == event.target.value * 1) {
    // returns true if input value is numeric string
}

Sie müssen dies jedoch an Ereignisse wie Keyup usw. binden.


6
<input name="amount" type="text" value="Only number in here"/> 

<script>
    $('input[name=amount]').keyup(function(){
        $(this).val($(this).val().replace(/[^\d]/,''));
    });
</script>

6

Ich habe einige großartige Antworten gesehen, aber ich mag sie so klein und einfach wie möglich, also wird vielleicht jemand davon profitieren. Ich würde Javascript Number()und isNaNFunktionen wie diese verwenden:

if(isNaN(Number(str))) {
   // ... Exception it is NOT a number
} else {
   // ... Do something you have a number
}

Hoffe das hilft.


1
Ich liebe es! Solch eine elegante Lösung, ohne Regex.
Levi Roberts

Dies ist keine Antwort auf die Frage. OP wurde gebeten, nur Text für eine Eingabe zuzulassen und anschließend nicht zu überprüfen.
Timberman

Ja, das ist die Wahrheit! Aber es gibt bereits eine akzeptierte Antwort, die ich für gut halte, aber ich dachte, das könnte jemandem helfen, und es ist schön und sauber.
Sicha

5

Verwenden Sie dieses DOM:

<input type = "text" onkeydown = "validate(event)"/>

Und dieses Skript:

validate = function(evt)
{
    if ([8, 46, 37, 39, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 35, 36].indexOf(evt.keyCode || evt.which) == -1)
    {
        evt.returnValue = false;
        if(evt.preventDefault){evt.preventDefault();}
    }
}

... ODER dieses Skript ohne indexOf mit zwei for...

validate = function(evt)
{
    var CharValidate = new Array("08", "046", "039", "948", "235");
    var number_pressed = false;
    for (i = 0; i < 5; i++)
    {
        for (Ncount = 0; Ncount < parseInt(CharValidate[i].substring(0, 1)) + 1; Ncount++)
        {
            if ((evt.keyCode || evt.which) == parseInt(CharValidate[i].substring(1, CharValidate[i].lenght)) + Ncount)
            {
                number_pressed = true;
            }
        }
    }
    if (number_pressed == false)
    {
        evt.returnValue = false;
        if(evt.preventDefault){evt.preventDefault();}
    }
}

Ich habe das onkeydown-Attribut anstelle von onkeypress verwendet, da das onkeydown-Attribut vor dem onkeypress-Attribut überprüft wird. Das Problem wäre im Google Chrome-Browser.

Mit dem Attribut "onkeypress" wäre TAB mit "verhindernDefault" auf Google Chrome nicht steuerbar, mit dem Attribut "onkeydown" wird TAB jedoch steuerbar!

ASCII-Code für TAB => 9

Das erste Skript enthält weniger Code als das zweite. Das Array der ASCII-Zeichen muss jedoch alle Schlüssel enthalten.

Das zweite Skript ist viel größer als das erste, aber das Array benötigt nicht alle Schlüssel. Die erste Ziffer an jeder Position des Arrays gibt an, wie oft jede Position gelesen wird. Für jeden Messwert wird 1 auf den nächsten erhöht. Zum Beispiel:




NCount = 0

48 + NCount = 48

NCount + +

48 + NCount = 49

NCount + +

...

48 + NCount = 57




Bei numerischen Schlüsseln sind es nur 10 (0 - 9), aber wenn sie 1 Million wären, wäre es nicht sinnvoll, ein Array mit all diesen Schlüsseln zu erstellen.

ASCII-Codes:

  • 8 ==> (Rücktaste);
  • 46 => (Löschen);
  • 37 => (linker Pfeil);
  • 39 => (rechter Pfeil);
  • 48 - 57 => (Zahlen);
  • 36 => (zu Hause);
  • 35 => (Ende);

5

Dies ist eine verbesserte Funktion:

function validateNumber(evt) {
  var theEvent = evt || window.event;
  var key = theEvent.keyCode || theEvent.which;
  if ((key < 48 || key > 57) && !(key == 8 || key == 9 || key == 13 || key == 37 || key == 39 || key == 46) ){
    theEvent.returnValue = false;
    if (theEvent.preventDefault) theEvent.preventDefault();
  }
}

4

Der beste Weg (ALLE Arten von Zahlen zulassen - echt negativ, echt positiv, ganzzahlig negativ, ganzzahlig positiv) ist:

$(input).keypress(function (evt){
    var theEvent = evt || window.event;
    var key = theEvent.keyCode || theEvent.which;
    key = String.fromCharCode( key );
    var regex = /[-\d\.]/; // dowolna liczba (+- ,.) :)
    var objRegex = /^-?\d*[\.]?\d*$/;
    var val = $(evt.target).val();
    if(!regex.test(key) || !objRegex.test(val+key) || 
            !theEvent.keyCode == 46 || !theEvent.keyCode == 8) {
        theEvent.returnValue = false;
        if(theEvent.preventDefault) theEvent.preventDefault();
    };
}); 

4

Dies ist die erweiterte Version der geowa4-Lösung . Unterstützt minund maxAttribute. Wenn die Zahl außerhalb des Bereichs liegt, wird der vorherige Wert angezeigt.

Sie können es hier testen.

Verwendungszweck: <input type=text class='number' maxlength=3 min=1 max=500>

function number(e) {
var theEvent = e || window.event;
var key = theEvent.keyCode || theEvent.which;
if(key!=13&&key!=9){//allow enter and tab
  key = String.fromCharCode( key );
  var regex = /[0-9]|\./;
  if( !regex.test(key)) {
    theEvent.returnValue = false;
    if(theEvent.preventDefault) theEvent.preventDefault();
    }   
  }
}

$(document).ready(function(){
    $("input[type=text]").filter(".number,.NUMBER").on({
        "focus":function(e){
         $(e.target).data('oldValue',$(e.target).val());
            },
        "keypress":function(e){
                e.target.oldvalue = e.target.value;
                number(e);
            },
        "change":function(e){
            var t = e.target;
            var min = $(t).attr("min");
            var max = $(t).attr("max");
            var val = parseInt($(t).val(),10);          
            if( val<min || max<val)
                {
                    alert("Error!");
                    $(t).val($(t).data('oldValue'));
                }

            }       
    });     
});

Wenn die Eingänge dynamisch sind, verwenden Sie Folgendes:

$(document).ready(function(){
    $("body").on("focus","input[type=text].number,.NUMBER",function(e){
        $(e.target).data('oldValue',$(e.target).val());
    }); 
    $("body").on("keypress","input[type=text].number,.NUMBER",function(e){
        e.target.oldvalue = e.target.value;
        number(e);
    }); 
    $("body").on("change","input[type=text].number,.NUMBER",function(e){
        var t = e.target
        var min = $(t).attr("min");
        var max = $(t).attr("max");
        var val = parseInt($(t).val());         
        if( val<min || max<val)
            {
                alert("Error!");
                $(t).val($(t).data('oldValue'));
            }
    }); 
});

@UserB dies sollte nichts löschen.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.