HTML-tekstinvoer staat alleen numerieke invoer toe

Is er een snelle manier om HTML-tekstinvoer (<input type=text />) zo in te stellen dat alleen numerieke toetsaanslagen (plus ‘.’) zijn toegestaan?


Antwoord 1, autoriteit 100%

Opmerking:dit is een bijgewerkt antwoord. Onderstaande opmerkingen verwijzen naar een oude versie die met sleutelcodes heeft gerommeld.

JavaScript

Probeer het zelf op JSFiddle.

U kunt de invoerwaarden van een tekst <input>filteren met de volgende functie setInputFilter(ondersteunt kopiëren+plakken, slepen+neerzetten, sneltoetsen, contextmenu bewerkingen, niet-typbare toetsen, de positie van de caret, verschillende toetsenbordindelingen en alle browsers sinds 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 = "";
      }
    });
  });
}

U kunt nu de functie setInputFiltergebruiken om een invoerfilter te installeren:

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

Bekijk de JSFiddle-demovoor meer voorbeelden van invoerfilters. Houd er ook rekening mee dat u nog steeds server-side validatie moet doen!

TypeScript

Hier is een TypeScript-versie hiervan.

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

Hier is ook een jQuery-versie van. Zie dit antwoord.

HTML 5

HTML 5 heeft een inheemse oplossing met <input type="number">(Zie de Specificatie ), maar merk op dat browserondersteuning varieert:

  • De meeste browsers valideren alleen de invoer bij het indienen van het formulier, en niet bij het typen.
  • Meeste mobiele browsers ondersteun de step, minEN maxATTIBUTEN.
  • Chrome (versie 71.0.3578.98) stelt de gebruiker nog steeds in staat om de tekens in te voeren een ein het veld. Zie ook deze vraag .
  • Firefox (versie 64.0) en rand (EdgeHTML-versie 17.17134) Sta de gebruiker nog steeds toe elke -tekst in het veld in te voeren.

Probeer het zelf op w3schools.com .


2, Autoriteit 24%

Gebruik deze DOM

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

en dit script

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();
  }
}

3, Autoriteit 13%

Ik heb lang en hard gezocht naar een goed antwoord hierop, en we hebben <input type="number"hard nodig, maar afgezien daarvan zijn deze 2 de meest beknopte manieren waarop ik zou kunnen bedenken:

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

Als je het niet-geaccepteerde teken een fractie van een seconde niet leuk vindt voordat het wordt gewist, is de onderstaande methode mijn oplossing. Let op de talrijke aanvullende voorwaarden, dit is om te voorkomen dat u allerlei navigatie- en sneltoetsen uitschakelt. Als iemand weet hoe we dit kunnen comprimeren, laat het ons dan weten!

<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) )">

Antwoord 4, autoriteit 12%

Hier is een eenvoudige die precies één decimaal toestaat, maar niet meer:

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

Antwoord 5, autoriteit 5%

De meeste antwoorden hier hebben allemaal de zwakte van het gebruik van key-events.

Veel van de antwoorden beperken uw vermogen om tekstkeuze met toetsenbordmacro’s te maken, kopieert + pasta en meer ongewenst gedrag, anderen lijken afhankelijk te zijn van specifieke jQuery-plug-ins, die vliegen met Machinegen doodt.

Deze eenvoudige oplossing lijkt het best te werken voor mij cross-platform, ongeacht het inputmechanisme (toetsaanslag, kopie + pasta, rechtsklikkopie + pasta, speech-to-tekst etc.). Alle tekstselectietoetsenbordmacro’s werken nog steeds, en het zou zelfs de mogelijkheid hebben om een ​​niet-numerieke waarde in te stellen door script.

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

6, Autoriteit 5%

HTML5 heeft <input type=number>, die geschikt klinkt voor u. Momenteel ondersteunt alleen Opera het in native, maar er is een project dat een JavaScript-implementatie heeft.


7, Autoriteit 4%

En nog een voorbeeld, die goed voor mij werkt:

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;
    }
};

Bevestig ook op toets / p>

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

en html:

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

Hier is een jsFiddle-voorbeeld


Antwoord 8, autoriteit 4%

HTML5 ondersteunt regexes, dus je zou dit kunnen gebruiken:

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

Waarschuwing: sommige browsers ondersteunen dit nog niet.


Antwoord 9, autoriteit 3%

Ik heb ervoor gekozen om een combinatie van de twee hier genoemde antwoorden te gebruiken, d.w.z.

<input type="number" />

en

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);">


Antwoord 10, autoriteit 2%

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();
    }
}

aanvullend kun je komma, punt en min (,.-) toevoegen

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

HTML

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

Antwoord 11

2 oplossingen:

Gebruik een formuliervalidator (bijvoorbeeld met jQuery-validatieplug-in)

Doe een controle tijdens de onblur (d.w.z. wanneer de gebruiker het veld verlaat) gebeurtenis van het invoerveld, met de reguliere expressie:

<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);"/>

Antwoord 12

Zo simpel….

// In een JavaScript-functie (kan HTML of PHP gebruiken).

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

In uw formulierinvoer:

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

Met ingang max. (Deze bovenstaande zorgen voor een 12-cijferig nummer)


Antwoord 13

Een veiligere benadering is het controleren van de waarde van de invoer, in plaats van toetsaanslagen te kapen en keyCodes te filteren.

Op deze manier is de gebruiker vrij om toetsenbordpijlen, modificatietoetsen, backspace, verwijderen, niet-standaard toetsenborden te gebruiken, de muis te gebruiken om te plakken, tekst te slepen en neer te zetten en zelfs toegankelijkheidsinvoer te gebruiken.

Het onderstaande script staat positieve en negatieve getallen toe

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>

Antwoord 14

Je kunt hiervoor een patroon gebruiken:

<input id="numbers" pattern="[0-9.]+" type="number">

Hier kunt u de volledige interfacetips voor mobiele websites.


Antwoord 15

Hieronder vindt u de oplossing. Hierin kan de gebruiker alleen een numericwaarde invoeren. Ook kan de gebruiker niet copy, paste, dragen dropin invoer.

Toegestane tekens

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

Niet toegestane personages en personages via evenementen

  • Alfabetische waarde
  • Speciale tekens
  • Kopiëren
  • Plakken
  • Slepen
  • Laat vallen
$(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">

16

Als u voorstelt aan het apparaat (misschien een mobiele telefoon) tussen alfa of numeriek, kunt u <input type="number">.

.


17

Een korte en zoete implementatie met jQuery en vervang () in plaats van te kijken naar event.Keycode of evenement. Wat:

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

Alleen kleine bijwerking die de getypte letter even verschijnt en CTRL / CMD + A lijkt zich een beetje vreemd te gedragen.


18

Gebruik gewoon types = “nummer” nu dit attribuut ondersteunen in de meeste browsers

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

19

Een eenvoudige manier om dit probleem op te lossen is implementeren van een jQuery-functie om te valideren met Regex De charaters die in het tekstvak zijn ingevoerd, bijvoorbeeld:

Uw HTML-code:

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

en de JS-functie met 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"/>
		

Antwoord 20

input type="number"is een HTML5-attribuut.

In het andere geval zal dit u helpen:

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)"/>

Antwoord 21

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-code:

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

werkt perfect omdat de backspace-sleutelcode 8 is en een regex-expressie dit niet toelaat, dus het is een gemakkelijke manier om de bug te omzeilen 🙂


Antwoord 22

Gewoon een andere variant met jQuery met

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

Antwoord 23

Ik heb een aantal geweldige antwoorden gezien, maar ik wil ze zo klein en eenvoudig mogelijk houden, dus misschien heeft iemand er wat aan. Ik zou javascript Number()en isNaNfunctionaliteit als volgt gebruiken:

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

Hopelijk helpt dit.


Antwoord 24

Je kunt de invoerwaarde (die standaard als tekenreeks wordt behandeld) ook vergelijken met zichzelf, geforceerd als numeriek, zoals:

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

Je moet dat echter binden aan gebeurtenissen zoals key-up enz.


Antwoord 25

<input name="amount" type="text" value="Only number in here"/> 
<script>
    $('input[name=amount]').keyup(function(){
        $(this).val($(this).val().replace(/[^\d]/,''));
    });
</script>

Antwoord 26

Gebruik deze DOM:

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

en dit script:

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();}
    }
}

… of dit script, zonder index van, met behulp van twee 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();}
    }
}

Ik heb het attribuut onkeydown gebruikt in plaats van On KeyPress, omdat het attribuut On-KEYDOWN wordt gecontroleerd voordat het attribuut van On-SkeyPress is. Het probleem zou in de Chrome-browser van Google zijn.

Met het attribuut “onkeyPress”, zou het tabblad ongecontroleerd zijn met “PreventDefault” op Google Chrome, maar met het attribuut “onkeydown”, wordt het tabblad regelbaar!

ASCII-code voor TAB = & GT; 9

Het eerste script heeft minder code dan de tweede, maar de reeks ASCII-tekens moet alle toetsen hebben.

Het tweede script is veel groter dan het eerste, maar de array heeft niet alle sleutels nodig. Het eerste cijfer in elke positie van de array is het aantal keren dat elke positie wordt gelezen. Voor elke meting wordt 1 verhoogd naar de volgende. Bijvoorbeeld:

NCount = 0

48 + NCount = 48

NCount + +

48 + NCount = 49

NCount + +

48 + NCount = 57

In het geval van numerieke sleutels zijn er slechts 10 (0 – 9) maar als het 1 miljoen waren, zou het geen zin hebben om een array te maken met al deze sleutels.

ASCII-codes:

  • 8 ==> (Backspace);
  • 46 => (Verwijderen);
  • 37 => (pijl naar links);
  • 39 => (pijl naar rechts);
  • 48 – 57 => (cijfers);
  • 36 => (thuis);
  • 35 => (einde);

Antwoord 27

Dit is een verbeterde functie:

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();
  }
}

Antwoord 28

De beste manier (ALLE type getallen toestaan – echt negatief, echt positief, iinteger negatief, geheel getal positief) is:

$(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();
    };
}); 

Antwoord 29

Dit is de uitgebreide versie van geowa4’s oplossing. Ondersteunt minen maxattributen. Als het nummer buiten bereik is, wordt de vorige waarde weergegeven.

Je kunt het hier testen.

Gebruik: <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'));
                }
            }       
    });     
});

Als de invoer dynamisch is, gebruik dan dit:

$(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'));
            }
    }); 
});

Other episodes