How to remove certain characters on keyup - javascript

I'd like to dynamically replace all non-numeric input as the user types. I've got the input type set to number, but that still allows the user to type non-numbers, the browser just flags it.
Instead of just flagging non-numbers (for exampl, commas, spaces, or dashes), I'd like to simply remove them as the user types. The code listed here, which is very straightforward, is completely deleting the string if a non-number is encountered, which is not what I want.
var cc = document.querySelector('input.credit-card-number');
cc.addEventListener('keyup',function(){
this.value = this.value.replace(/[^0-9]/g,'');
});
<input type="number" class="credit-card-number">
Edit
This is a Firefox-only problem. Chrome seems to work as expected. I'd still appreciate a fix if anyone can come up with one.

Sticking with javascript only, a slight modification will make this work. Change the input type from number to text.
var input = document.querySelector('input.credit-card-number');
input.addEventListener('keyup', function(e) {
this.value = this.value.replace(/[^0-9]/, '');
});
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<input type="text" class="form-control credit-card-number" placeholder="Ex: 0000 0000 0000 0000" />
Don't look like you want jquery solution but if you want to use one you can go for input masking for which there is a library too and support various masking options like Credit Card, IP Address and Mobile Numbers you can see a demo for the credit card concerned section below I used firefox to create and test the demo.
//Credit Card
$('.credit-card-number').inputmask('9999 9999 9999 9999', {
placeholder: '____ ____ ____ ____'
});
<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>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.inputmask/3.3.4/jquery.inputmask.bundle.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/jquery.inputmask/3.3.4/css/inputmask.css" rel="stylesheet" />
<input type="text" class="form-control credit-card-number" placeholder="Ex: 0000 0000 0000 0000" />

Update
Firefox looks at this.value and says, "Ok, I'll just take the whole value of whatever is in the input and overwrite the whole value." Chrome somehow intuitively interprets keydown the way you intended, but Firefox literally follows your code truthfully. Unfortunately, that's not what you want, so you'll need to take a different approach with Firefox.
Instead of comparing strings, try comparing keystrokes a character at a time. keyboardEvent.keycode for Chrome and keyboardEvent.which for Firefox.
See Demo 2. BTW, keydown event is usually more reliable, if for some reason keyup is one off on results, keydown is probably better. If keydown needs 2 keystrokes to work, then try listening on capture phase instead of the bubble phase by setting the third parameter to true.
DOMObject.addEventListener('keydown', funk, true)
Change regex to:
/\D/gi
\D means anything that is not a digit and the i flag is for case insensitivity.
Demo 1
var cc = document.querySelector('input.credit-card-number');
cc.addEventListener('keyup', function() {
this.value = this.value.replace(/\D/gi, '');
});
<input type="number" class="credit-card-number">
Demo 2
charCode > 47 && charCode < 58 ......0 to 9
charCode > 95 && charCode < 105......0 to 9 scroll locked 10-key pad
charCode == 8........................← Backspace
var cc = document.querySelector('input.credit-card-number');
cc.addEventListener('keydown', function(e) {
var charCode = (e.which) ? e.which : e.keyCode;
if ((charCode > 47 && charCode < 58) || (charCode > 95 && charCode < 105) || charCode == 8) {
return true;
}
e.preventDefault();
return false;
}, true);
<input type="number" class="credit-card-number">

Just change the input type from number to text.
edit:
At least in Mozilla Firefox it works. See here
https://jsfiddle.net/h9ap2ag8/1/
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<input type="text" class="credit-card-number">
</body>
</html>
var cc = document.querySelector('input.credit-card-number');
cc.addEventListener('keyup',function(){
this.value = this.value.replace(/[^0-9]/g,'');
});

Related

How to only allow whole numbers in input [duplicate]

I'm using the jQuery Tools Validator which implements HTML5 validations through jQuery.
It's been working great so far except for one thing. In the HTML5 specification, the input type "number" can have both integers and floating-point numbers.
This seems incredibly short-sighted since it will only be a useful validator when your database fields are signed floating-point numbers (for unsigned ints you'll have to fall back to pattern validation and thus lose extra features like the up and down arrows for browsers that support it).
Is there another input type or perhaps an attribute that would restrict the input to just unsigned integers?
I couldn't find any.
Setting the step to 1 is not the answer since it doesn't restrict the input. You can still type a negative floating-point number into the textbox.
Also, I am aware of pattern validation (I mentioned it in my original post), but that was not part of the question.
I wanted to know if HTML5 allowed restricting an input of type "number" to positive integer values. To this question the answer, it seems, would be "no, it does not".
I didn't want to use pattern validation because this causes some drawbacks when using jQuery Tools validation, but it now seems that the specification doesn't allow for a cleaner way to do this.
The best you can achieve with HTML only (documentation):
<input type="number" min="0" step="1"/>
Set the step attribute to 1:
<input type="number" step="1" />
This seems a bit buggy in Chrome right now so it might not be the best solution at the moment.
A better solution is to use the pattern attribute, that uses a regular expression to match the input:
<input type="text" pattern="\d*" />
\d is the regular expression for a number, * means that it accepts more than one of them.
<input type="text" name="PhoneNumber" pattern="[0-9]{10}" title="Phone number">
Using this code, the input to the text field limits to enter only digits. Pattern is the new attribute available in HTML 5.
Pattern attribute doc
The easy way using JavaScript:
<input type="text" oninput="this.value = this.value.replace(/[^0-9.]/g, ''); this.value = this.value.replace(/(\..*)\./g, '$1');" >
Pattern is nice but if you want to restrict the input to numbers only with type="text", you can use oninput and a regex as below:
<input type="text" oninput="this.value=this.value.replace(/[^0-9]/g,'');" id="myId"/>
I warks for me :)
<input type="number" oninput="this.value = Math.round(this.value);"/>
This is not only for HTML5. This works fine in all browsers. Try this:
document.getElementById("input").addEventListener("keyup", function() {
this.value = this.value.replace(/[^0-9]/g, "");
});
<input id="input" type="text">
Pattern are always preferable for restriction, try oninput and min occur 1 for inputting only numbers from 1 onwards
<input type="text" min="1" oninput="this.value=this.value.replace(/[^0-9]/g,'');"
value=${var} >
Shortest
This is size improvement of R. Yaghoobi answer
<input type="number" oninput="this.value|=0"/>
We use here standard shorthand for "OR" operator e.g 9 | 2 = 11 in binary: 0b1001 | 0b1010 = 0b1011 . This operator first cast numbers to integers in implicit way and then do OR. But because OR with zero don't change anything so number is cast to integer. OR with non-number string gives 0.
Just putting it in your input field : onkeypress='return event.charCode >= 48 && event.charCode <= 57'
I was working oh Chrome and had some problems, even though I use html attributes. I ended up with this js code
$("#element").on("input", function(){
var value = $(this).val();
$(this).val("");
$(this).val(parseInt(value));
return true;
});
Set step attribute to any float number, e.g. 0.01 and you are good to go.
have you tried setting the step attribute to 1 like this
<input type="number" step="1" />
Maybe it does not fit every use case, but
<input type="range" min="0" max="10" />
can do a fine job: fiddle.
Check the documentation.
This is an old question, but the accessible (and now supported in most browsers) version would be:
<input type="text" inputmode="numeric" pattern="[0-9]*">
See https://technology.blog.gov.uk/2020/02/24/why-the-gov-uk-design-system-team-changed-the-input-type-for-numbers/
Yes, HTML5 does. Try this code (w3school):
<!DOCTYPE html>
<html>
<body>
<form action="">
Quantity (between 1 and 5): <input type="number" name="quantity" min="1" max="5" />
<input type="submit" />
</form>
</body>
</html>
See the min and max paremeter? I tried it using Chrome 19 (worked) and Firefox 12 (did not work).
Set step="any" . Works fine.
Reference :http://blog.isotoma.com/2012/03/html5-input-typenumber-and-decimalsfloats-in-chrome/
Currently, it is not possible to prevent a user from writing decimal values in your input with HTML only.
You have to use javascript.
var valKeyDown;
var valKeyUp;
function integerOnly(e) {
e = e || window.event;
var code = e.which || e.keyCode;
if (!e.ctrlKey) {
var arrIntCodes1 = new Array(96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 8, 9, 116); // 96 TO 105 - 0 TO 9 (Numpad)
if (!e.shiftKey) { //48 to 57 - 0 to 9
arrIntCodes1.push(48); //These keys will be allowed only if shift key is NOT pressed
arrIntCodes1.push(49); //Because, with shift key (48 to 57) events will print chars like #,#,$,%,^, etc.
arrIntCodes1.push(50);
arrIntCodes1.push(51);
arrIntCodes1.push(52);
arrIntCodes1.push(53);
arrIntCodes1.push(54);
arrIntCodes1.push(55);
arrIntCodes1.push(56);
arrIntCodes1.push(57);
}
var arrIntCodes2 = new Array(35, 36, 37, 38, 39, 40, 46);
if ($.inArray(e.keyCode, arrIntCodes2) != -1) {
arrIntCodes1.push(e.keyCode);
}
if ($.inArray(code, arrIntCodes1) == -1) {
return false;
}
}
return true;
}
$('.integerOnly').keydown(function (event) {
valKeyDown = this.value;
return integerOnly(event);
});
$('.integerOnly').keyup(function (event) { //This is to protect if user copy-pastes some character value ,..
valKeyUp = this.value; //In that case, pasted text is replaced with old value,
if (!new RegExp('^[0-9]*$').test(valKeyUp)) { //which is stored in 'valKeyDown' at keydown event.
$(this).val(valKeyDown); //It is not possible to check this inside 'integerOnly' function as,
} //one cannot get the text printed by keydown event
}); //(that's why, this is checked on keyup)
$('.integerOnly').bind('input propertychange', function(e) { //if user copy-pastes some character value using mouse
valKeyUp = this.value;
if (!new RegExp('^[0-9]*$').test(valKeyUp)) {
$(this).val(valKeyDown);
}
});
From the specs
step="any" or positive floating-point number
Specifies the value granularity of the element’s value.
So you could simply set it to 1:
Posting it, if anyone requires it in future
const negativeValuePrevent = (e) => {
const charCode = e.which ? e.which : e.keyCode;
if(charCode > 31 && (charCode < 48 || charCode > 57)
&& charCode !== 46){
if(charCode < 96 || charCode > 105){
e.preventDefault();
return false;
}
}
return true;
};
Most of the answers are outdated.
The following does not work anymore:
<!-- It doesn't invalidate decimals when using validators -->
<input type="number" min="0" step="1" />
The below solution is much more elegant and straight-forward and works on all latest browsers as of early 2022.
<!-- It DOES invalidate decimals when using validators -->
<input type="number" pattern="\d*" />
The integer input would mean that it can only take positive numbers, 0 and negative numbers too. This is how I have been able to achieve this using Javascript keypress.
<input type="number" (keypress)="keypress($event, $event.target.value)" >
keypress(evt, value){
if (evt.charCode >= 48 && evt.charCode <= 57 || (value=="" && evt.charCode == 45))
{
return true;
}
return false;
}
The given code won't allow user to enter alphabets nor decimal on runtime, just positive and negative integer values.
Short and user friendly
This solution supports tab, backspace, enter, minus in intuitive way
<input type=text onkeypress="return /^-?[0-9]*$/.test(this.value+event.key)">
however it not allow to change already typed number to minus and not handle copy-paste case.
As alternative you can use solution based on R. Yaghoobi answer which allow to put minus and handle copy-paste case, but it delete whole number when user type forbidden character
<input type=text oninput="this.value= ['','-'].includes(this.value) ? this.value : this.value|0">
NOTE: above inline solutions use only in small projects. In other case opaque them in functions and move to your js files.
In the Future™ (see Can I Use), on user agents that present a keyboard to you, you can restrict a text input to just numeric with input[inputmode].

Prevent decimal place being entered into input field on mobile

I have this javascript code, which, on desktop browsers works well to ensure the user can only enter characters 1 to 9.
However when testing in Chrome on Android, the keypad presented includes dash and period characters which the field accepts. How can I prevent this?
function isNumberKey(evt) {
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (charCode > 31 && (charCode < 48 || charCode > 57))
return false;
return true;
}
UPDATE:
This is how I am using the function in HTML:
<input type="number" class="form-control"
onkeypress="return isNumberKey(event)" />
I have another function to prevent being able to copy and paste non numeric chars into the code.
$(document).ready(function() {
$('#number').bind("cut copy paste drag drop", function(e) {
e.preventDefault();
});
});
And if all else fails, there's server-side validation.
I really want to stop decimal places being possible on the front end. Remember the character range I specified restricts this fine on a qwerty keyboard - however on android (and probably others) the number key pad allows entering . and -
One possible solution:
<script>
function onlyNumbers(num){
if ( /[^0-9]+/.test(num.value) ){
num.value = num.value.replace(/[^0-9]*/g,"")
}
}
</script>
<input type="text" onkeyup="onlyNumbers(this)">
Try using the HTML attributes min and max to set the range of numbers and type=number to allow for only numbers.
Quantity (between 1 and 5):
<input type="number" name="quantity" min="1" max="5">

How to accept letters only in bootstrap tagsinput

So I have this problem. I want bootstrap tagsinput to only accept letters, comma, and enter key. How to solve this problem? I use this bootstrap: https://bootstrap-tagsinput.github.io/bootstrap-tagsinput/examples/
HTML:
<div class="form-group">
<div class="col-sm-4">
<input type="text" id="myinputs" class="form-control" name="skills" placeholder="Enter skill(s), separate each with a comma" data-role="tagsinput">
</div>
</div>
JavaScript:
$(document).ready(function() {
$('#myinputs').keypress(function(event){
var inputValue = event.charCode;
if (!(inputValue >= 65/*A*/ && inputValue <=90/*Z*/) && !(inputValue >=97/*a*/ && inputValue <= 122/*z*/) && (inputValue != 44/*comma*/ && inputValue != 13/*enter key*/)) {
event.preventDefault();
}
});
});
When there is no tagsinput, the javascript code is working. How to solve this problem?
Here is the simple way, but css is not included.
$('input').tagsinput({
freeInput: true
});
$('input').on('beforeItemAdd', function(event) {
// event.cancel: set to true to prevent the item getting added
event.cancel = !(/^[0-9A-Za-z\.,\n]+$/.test(event.item));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://rawgit.com/TimSchlechter/bootstrap-tagsinput/master/src/bootstrap-tagsinput.js"></script>
<input type="text" id="category" data-role="tagsinput" />
Probably you can try different approach and use beforeItemAdd event to check the content of new item. If it contains unwanted charactes you cancel its addition.
$('input').on('beforeItemAdd', function(event) {
// check item contents
if (!/^[a-zA-Z,]+$/.test(event.item)) {
// set to true to prevent the item getting added
event.cancel = true;
}
});
You cannot do it only with html. You can define a function an use it like this:
<input type="text" id="myinputs" class="form-control" name="skills" placeholder="Enter skill(s), separate each with a comma" data-role="tagsinput"
onkeydown="letterOnly(event)"/>
function letterOnly(event) {
var key = event.keyCode;
return ((key >= 65 && key <= 90) || key == 8 || key == 32);// 8 for backspace and 32 for space
};
you can use the below regular expression to check letters, comma,
/^[A-Za-z,]$/;
$(document).ready(function() {
$('#myinputs').keyup(function(event){
var inputValue = event.charCode;
if (!/^[A-Za-z,]$/.test(event.item)) {
// set to true to prevent the item getting added
event.cancel = true;
}
});
});
And you must not bypass the point that,
There is no way to match an enter with a regular expression, since regular expressions are made to match string patterns, not keyboard input. (I know that is what you use it for, but still).
Your best bet would be to check the keycode of the special keys, before you check against the regular expression. The enter key is most likely keycode 13 (I havent checked, but you can easily check by printing the code to the screen).

How to restrict the value in html.textbox for time format

I need to restrict the value in html.textbox for time format (00:00:00) [hh:mm:ss) using jquery . restricted values are: special Char , a-z , A-Z all others. Only allowed numbers. ":" values are should be default.
FIDDLE: http://jsfiddle.net/b9Arm/
HTML
<input maxlength="8" type="text" id="time" style="border: 1px solid" />
JS
$('#time').keypress(function(e) {
if (!((e.keyCode >= 48 && e.keyCode <= 57) ||
(e.shiftKey === true && e.keyCode === 58))) {
e.preventDefault();
}
});
Note: Other than 48 to 57, also add the keycodes for numbers entered from the numeric keypad. Additionally, you'll need some validation to ensure that the format is indeed dd:dd:dd.
For example:
$('#time').blur(function (e) {
if(!(/\d\d\:\d\d\:\d\d/.test($('#time').val()))) {
alert('Achtung Baby!')
}
});
Click Here http://keith-wood.name/timeEntry.html ,to know about jquery time entry in textbox html

Restrict numbers and limit them to two

How to restrict my text field to numbers only and limit them in two with a single function.
Since no one has suggested a regular expression, I will. :-)
var re = /^-?\d{1,2}$/;
if (re.test(input.value)) {
// number is one or two digits with optional leading minus
} else {
// it's not
}
For limiting them to enter only 2 char use maxlength attribute of input. To check enter string is number or not user isNaN(str) function.
<script type="text/javascript">
function ValidateField(FieldName){
// Get fields value
var FieldVal = document.GetElementById(FieldName).value;
// Check it's a number, and then check it's range is correct
// Alternatively you could do FieldVal.length
if(!isNaN(FieldVal) && (FieldVal < 100 && FieldVal > -100))
alert("Valid!");
else
alert("Invalid");
}
</script>
<input type="text" name="MyField" />
<button onclick="ValidateField('MyField')">Test</button>
I've interpreted 'limit to 2' to mean a number ranging from -99 to 99.
In HTML5 you can just use: <input type="number" />
If you are using jquery:
$('#myTextAreaID').keydown(function(event) {
if (event.target.length >1 || event.keyCode < 48 || event.keyCode > 57) {
event.preventDefault();
}
});
if you want it to work with the numeric keypad, you will need to also allow keycodes 96 to 105

Categories