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 setInputFilter
gebruiken 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
,min
ENmax
ATTIBUTEN. - Chrome (versie 71.0.3578.98) stelt de gebruiker nog steeds in staat om de tekens in te voeren
e
ene
in 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 numeric
waarde invoeren. Ook kan de gebruiker niet copy
, paste
, drag
en drop
in 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 isNaN
functionaliteit 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 min
en max
attributen. Als het nummer buiten bereik is, wordt de vorige waarde weergegeven.
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'));
}
});
});