Reputation: 7365
I'm trying to add functionality to input date fields so as when the users enters in digits, slashes "/" get automatically added.
So suppose I have the following html:
<input type="text" id="fooDate" />
And suppose I have the following javascript:
var dateField = document.getElementById("fooDate");
dateField.onkeyup = bar;
What should bar
be?
So far the best google result was:
function bar(evt)
{
var v = this.value;
if (v.match(/^\d{2}$/) !== null) {
this.value = v + '/';
} else if (v.match(/^\d{2}\/\d{2}$/) !== null) {
this.value = v + '/';
}
}
Thanks!
also -- I know having slashes being entered as you type sucks. Just roll with it :p
Upvotes: 25
Views: 79367
Reputation: 1761
This is one simples way:
Date: <input name=x size=10 maxlength=10 onkeydown="this.value=this.value.replace(/^(\d\d)(\d)$/g,'$1/$2').replace(/^(\d\d\/\d\d)(\d+)$/g,'$1/$2').replace(/[^\d\/]/g,'')">
Here ia a fiddle : https://jsfiddle.net/y6mnpc1j/
Upvotes: 20
Reputation: 67
Here is an updated Jquery version. Just change #txtDate with your field ID
$(document).ready(function() {
$("#txtDate").keyup(function(){
if ($(this).val().length == 2){
$(this).val($(this).val() + "/");
}else if ($(this).val().length == 5){
$(this).val($(this).val() + "/");
}
});
});
Source: https://forum.jquery.com/topic/auto-slash-in-date-field
Upvotes: -1
Reputation: 11
My regex solution for React:
// add auto "/" for date, i.e. MM/YY
handleExpInput(e) {
// ignore invalid input
if (!/^\d{0,2}\/?\d{0,2}$/.test(e.target.value)) {
return;
}
let input = e.target.value;
if (/^\d{3,}$/.test(input)) {
input = input.match(new RegExp('.{1,2}', 'g')).join('/');
}
this.setState({
expDateShow: input,
});
}
Upvotes: 1
Reputation: 2200
// This solution also handle the delete and backspace keys:
jQuery('input[name="dateofbirth"]').bind('keyup',function(event){
var key = event.keyCode || event.charCode;
if (key == 8 || key == 46) return false;
var strokes = $(this).val().length;
if (strokes === 2 || strokes === 5){
var thisVal = $(this).val();
thisVal += '/';
$(this).val(thisVal);
}
// if someone deletes the first slash and then types a number this handles it
if (strokes>=3 && strokes<5){
var thisVal = $(this).val();
if (thisVal.charAt(2) !='/'){
var txt1 = thisVal.slice(0, 2) + "/" + thisVal.slice(2);
$(this).val(txt1);
}
}
// if someone deletes the second slash and then types a number this handles it
if (strokes>=6){
var thisVal = $(this).val();
if (thisVal.charAt(5) !='/'){
var txt2 = thisVal.slice(0, 5) + "/" + thisVal.slice(5);
$(this).val(txt2);
}
}
});
Upvotes: 2
Reputation: 1267
Handles backspace, delete, paste, long press.
let $jqDate = $('.date-slashes');
$jqDate.bind('keyup', function(ev) {
if (ev.which !== 8) {
let input = $jqDate.val();
let out = input.replace(/\D/g, '');
let len = out.length;
if (len > 1 && len < 4) {
out = out.substring(0, 2) + '/' + out.substring(2, 3);
} else if (len >= 4) {
out = out.substring(0, 2) + '/' + out.substring(2, 4) + '/' + out.substring(4, len);
out = out.substring(0, 10)
}
$jqDate.val(out)
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<input name="dob" class="date-slashes" type="tel" maxlength="10" placeholder="mm/dd/yyyy">
Upvotes: 5
Reputation: 1
<SCRIPT LANGUAGE="JavaScript">
function addSlashes(f)
{
f.value = f.value.slice(0,2)+"/"+f.value.slice(2,4)+"/"+f.value.slice(4,7);
}
</SCRIPT>
Upvotes: -2
Reputation: 511
For react users, who want to perform the manipulation to the date before you sync it to the state, you can do this:
onChangeText={(text) => {
// Format the value and remove slashes, so addItemEvery will work
let value = text.replace(/\/+/g, "");
// We substring to add / to only the first part, every two characters
const firstFourChars = addItemEvery(value.substring(0, 5), "/", 2);
value = firstFourChars + value.substring(5, value.length);
... e.g. update state
}
...
function addItemEvery(str, item, every) {
for (let i = 0; i < str.length; i++) {
if (!(i % (every + 1))) {
str = str.substring(0, i) + item + str.substring(i);
}
}
return str.substring(1);
}
Upvotes: 1
Reputation: 41
I spent some time working on the solution that Chris posted above and am accounting for everything except pasting, which isn't a requirement from the original poster as I read it.
//Bind keyup/keydown to the input
$('.date').bind('keyup', 'keydown', function(e) {
//check for numerics
var thisValue = $(this).val();
thisValue = thisValue.replace(/[^0-9\//]/g, '');
//get new value without letters
$(this).val(thisValue);
thisValue = $(this).val();
var numChars = thisValue.length;
$('#keyCount').html(numChars);
var thisLen = thisValue.length - 1;
var thisCharCode = thisValue.charCodeAt(thisLen);
$('#keyP').html(thisCharCode);
//To accomdate for backspacing, we detect which key was pressed - if backspace, do nothing:
if (e.which !== 8) {
if (numChars === 2) {
if (thisCharCode == 47) {
var thisV = '0' + thisValue;
$(this).val(thisV);
} else {
thisValue += '/';
$(this).val(thisValue);
}
}
if (numChars === 5) {
if (thisCharCode == 47) {
var a = thisValue;
var position = 3;
var output = [a.slice(0, position), '0', a.slice(position)].join('');
$(this).val(output);
} else {
thisValue += '/';
$(this).val(thisValue);
}
}
if (numChars > 10) {
var output2 = thisValue.slice(0, 10);
$(this).val(output2);
}
}
});
$('.date').blur(function() {
var thisValue = $(this).val();
var numChars = thisValue.length;
if (numChars < 10) {
$(this).addClass('brdErr');
$('#dateErr1').slideDown('fast');
$(this).select();
} else {
$(this).removeClass('brdErr');
$('#dateErr1').hide();
}
});
There is a lot added and a CSS class for an error message for invalid dates.
Upvotes: 1
Reputation: 1059
If you're looking for pure js version of @Chris's answer
var newInput = document.getElementById("theDate");
newInput.addEventListener('keydown', function( e ){
if(e.which !== 8) {
var numChars = e.target.value.length;
if(numChars === 2 || numChars === 5){
var thisVal = e.target.value;
thisVal += '/';
e.target.value = thisVal;
}
}
});
And HTML section might be(if necessary):
<input type="text" name="theDate" id="birthdate" maxlength="10"/>
Upvotes: 2
Reputation: 455
Update/Edit: Obviously the most simple solution today with widespread HTML5 support is to use <input type="date" name="yourName">
.
For those complaining that it doesn't accommodate backspaces or pasting, I modified the original:
//Put our input DOM element into a jQuery Object
var $jqDate = jQuery('input[name="jqueryDate"]');
//Bind keyup/keydown to the input
$jqDate.bind('keyup','keydown', function(e){
//To accomdate for backspacing, we detect which key was pressed - if backspace, do nothing:
if(e.which !== 8) {
var numChars = $jqDate.val().length;
if(numChars === 2 || numChars === 5){
var thisVal = $jqDate.val();
thisVal += '/';
$jqDate.val(thisVal);
}
}
});
`
Working Fiddle: https://jsfiddle.net/ChrisCoray/hLkjhsce/
Upvotes: 26
Reputation: 743
This solution works for me. I have captured the blur event though you will have to change the code if you want to use keyup event. HTML
<input type="text" id="fooDate" onblur="bar(this)"/>
Javascript
function bar(txtBox) {
if (txtBox == null) {
return ''
}
var re = new RegExp(/(\d{6})(\d{2})?/);
if (re.test(txtBox.value)) {
if (txtBox.value.length == 8) {
txtBox.value = txtBox.value.substring(0, 2) + '/' + txtBox.value.substring(2, 4) + '/' + txtBox.value.substring(4, 8)
}
if (txtBox.value.length == 7) {
txtBox.value = txtBox.value.substring(0, 2) + '/' + txtBox.value.substring(2, 3) + '/' + txtBox.value.substring(3, 8)
}
if (txtBox.value.length == 6) {
if (txtBox.value.substring(4, 6) < 20) {
txtBox.value = txtBox.value.substring(0, 2) + '/' + txtBox.value.substring(2, 4) + '/20' + txtBox.value.substring(4, 6);
} else {
txtBox.value = txtBox.value.substring(0, 2) + '/' + txtBox.value.substring(2, 4) + '/19' + txtBox.value.substring(4, 6);
}
}
}
return txtBox.value;
}
Upvotes: 0
Reputation: 6851
Try to use this plugin : http://digitalbush.com/projects/masked-input-plugin/ It works with jquery.
Upvotes: 0