Я унаследовал следующий скрипт, и некоторые из них должны быть улучшены. Функция проверяет, что введены только допустимые символы (/), а затем форматирует дату, введенную как 1/1/12, будет переформатирована как 01/01/2012. Эта часть прекрасно работает после небольшой настройки. Теперь мне нужно сделать еще один шаг проверки и добавить год, если он опущен, если пользователь вводит 1/1, его нужно отформатировать и добавить текущий год (например, 01/01/2012).Улучшение валидации даты JS
Пример данных, вводимых пользователем, и необходимые (рабочие) выходы
- а/а/а предупреждение пользователю ошибки - проверить
- 1/2/10 обновления поля ввода, чтобы читать как 01.03.2010
- 01/01/12 обновляет поле ввода, чтобы читать как 01/01/2012
- 1/10/2 обновляет поле ввода, чтобы читать как 01/10/2002
желаемого обновления (в дополнении выше) 1/9 обновляет поле ввода для чтения как 01/09/2012
Вот текущая функция (вы можете изменять, переписывать, независимо от того, сохранились ли эти функции). Библиотека jQuery 1.7 используется и может быть реализована.
function ValidateDate(obj)
{
/************************************************
DESCRIPTION: Validates that a string contains only
valid dates with 2 digit month, 2 digit day,
4 digit year. Date separator has to be/
Uses combination of regular expressions and
string parsing to validate date.
Ex. mm/dd/yyyy
PARAMETERS:
ValidateDate(strValue) - String to be tested for validity
RETURNS:
True if valid, otherwise false.
REMARKS:
Avoids some of the limitations of the Date.parse()
method such as the date separator character.
*************************************************/
var checkOK = "/";
var checkStr = obj.value;
var allValid = true;
var p = /(\d{1,2})\/(\d{1,2})\/(\d{1,4})/;
var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
// check to see if valid characters were used
for (i = 0; i < checkStr.length; i++)
{
ch = checkStr.charAt(i);
for (j = 0; j < checkOK.length; j++)
if (ch == checkOK.charAt(j))
break;
if (j == checkOK.length)
{
allValid = false;
break;
}
}
if (!allValid)
{
alert("Please use only a combination of " + checkOK + "\'s charaters in the date field. Dates should be entered in the format of mm/dd/yyyy.");
setTimeout((function() { obj.select() }), 0);
return (false);
}
// converts to mm/dd/yyyy format
if (!obj.value.match(p)) return;
num=new Array();
num=obj.value.match(p);
if (num[1].length == 1) num[1]="0" + num[1];
if (num[2].length == 1) num[2]="0" + num[2];
if (num[3].length == 1) num[3]="200" + num[3];
if (num[3].length == 2) num[3]="20" + num[3];
obj.value= num[1] + "/" + num[2] + "/" + num[3];
//check to see if in correct format
if(!objRegExp.test(obj.value))
{
alert('The date entered is not properly formatted.');
return false; //doesn't match pattern, bad date
}
else{
var arrayDate = obj.value.split(RegExp.$1); //split date into month, day, year
var intDay = parseInt(arrayDate[1],10);
var intYear = parseInt(arrayDate[2],10);
var intMonth = parseInt(arrayDate[0],10);
//check for valid month
if(intMonth > 12 || intMonth < 1) {
alert('The date entered is invalid');
return false;
}
//create a lookup for months not equal to Feb.
var arrayLookup = { '01' : 31,'03' : 31, '04' : 30,'05' : 31,'06' : 30,'07' : 31,
'08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31}
//check if month value and day value agree
if(arrayLookup[arrayDate[0]] != null) {
if(intDay <= arrayLookup[arrayDate[0]] && intDay != 0)
return true; //found in lookup table, good date
}
//check for February
var booLeapYear = (intYear % 4 == 0 && (intYear % 100 != 0 || intYear % 400 == 0));
if(((booLeapYear && intDay <= 29) || (!booLeapYear && intDay <=28)) && intDay !=0)
return true; //Feb. had valid number of days
}
alert(obj.value + ' is not a valid date.');
// return false; //any other values, bad date
}
Итак, в чем вопрос? –
@ VladMinaev - как я могу изменить этот скрипт для создания требуемых выходов. * a/a/предупреждение пользователя об ошибке - проверка * 1/2/10 обновляет поле ввода для чтения как 01/03/2010 * 01/01/12 обновляет поле ввода для чтения как 01/01/2012 * 1/10/2 обновляет поле ввода для чтения как 01/10/2002 'Новый сценарий может использоваться до тех пор, пока он делает это. – HPWD