What's the best way to automatically insert slashes '/' in date fields
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.getEl开发者_StackOverflow中文版ementById("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
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/
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/
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">
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"/>
// 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);
}
}
});
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.
JSFiddle Here
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);
}
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,
});
}
Try to use this plugin : http://digitalbush.com/projects/masked-input-plugin/ It works with jquery.
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;
}
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
<SCRIPT LANGUAGE="JavaScript">
function addSlashes(f)
{
f.value = f.value.slice(0,2)+"/"+f.value.slice(2,4)+"/"+f.value.slice(4,7);
}
</SCRIPT>
精彩评论