dareway-rui
Version:
454 lines (374 loc) • 14.3 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', {
value: true
});
exports.formatDateTime = formatDateTime;
exports.normalizeInput = normalizeInput;
exports.setCursor = setCursor;
exports.isEmptyDate = isEmptyDate;
exports.validDateTime = validDateTime;
var DEFAULT_LEAST_YEAR = '0000';
var DEFAULT_MAX_YEAR = '9999';
var NUMBER_CHAR = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
var DECOLLATOR_CHAR = [':', '-', '/', ' '];
function replaceString(objString, sourceString, reString) {
if (
objString == null ||
objString.length == 0 ||
sourceString == null ||
sourceString.length == 0 ||
objString.search(sourceString) < 0
) {
return objString;
}
var frontStr = objString.substr(0, objString.search(sourceString));
var lastStr = objString.substr(objString.search(sourceString) + sourceString.length);
return (frontStr || '') + (reString || '') + (lastStr || '');
}
function getZero(zeroLength) {
if (zeroLength == null || zeroLength == 0) {
return '';
}
var temp = '';
for (var i = 0; i < zeroLength; i++) {
temp += '0';
}
return temp;
}
function isNumber(char) {
return NUMBER_CHAR.find(function(c) {
return c === char;
});
}
function isDecollator(char) {
return DECOLLATOR_CHAR.find(function(c) {
return c === char;
});
}
function isValidChar(char) {
return isNumber(char) || isDecollator(char);
}
function formatDateTime(mask, dateTimeString) {
var autoConvertMonthAndDay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
var yearIndex = mask.search('yyyy');
var monthIndex = mask.search('MM');
var dayIndex = mask.search('dd');
var hourIndex = mask.search('hh');
var minuteIndex = mask.search('mm');
var secondIndex = mask.search('ss'); // 输入日期字符串与当前格式不吻合,矫正.
if (dateTimeString == null || dateTimeString.length == 0 || dateTimeString.length != mask.length) {
dateTimeString = getZero(mask.length);
}
var result = mask;
var yearString = '';
var monthString = '';
var dayString = '';
var hourString = '';
var minuteString = '';
var secondString = '';
if (yearIndex >= 0) {
var year = Number(dateTimeString.substr(yearIndex, 4));
if (isNaN(year) || year < Number(DEFAULT_LEAST_YEAR)) {
yearString = DEFAULT_LEAST_YEAR.toString();
} else if (year > Number(DEFAULT_MAX_YEAR)) {
yearString = DEFAULT_MAX_YEAR.toString();
} else {
yearString = year.toString();
}
if (yearString.length < 4) {
yearString = getZero(4 - yearString.length) + yearString;
}
result = replaceString(result, 'yyyy', yearString);
}
if (monthIndex >= 0) {
var month = Number(dateTimeString.substr(monthIndex, 2));
if (isNaN(month) || month > 12 || month <= 0) {
// 原来是day>12, 但当 "03"->"12" 修改时,中间结果"13"会引发校验失败,结果变为02
if (autoConvertMonthAndDay && yearString != '0000') {
monthString = '01';
} else {
monthString = '00';
}
} else {
monthString = month.toString();
}
if (monthString.length < 2) {
monthString = getZero(2 - monthString.length) + monthString;
}
result = replaceString(result, 'MM', monthString);
}
if (dayIndex >= 0) {
var day = Number(dateTimeString.substr(dayIndex, 2));
if (isNaN(day) || day > 31 || day <= 0) {
// 原来是day>31, 但当 "16"->"31" 修改时,中间结果"35"会引发校验失败,结果变为31
if (autoConvertMonthAndDay && yearString != '0000' && monthString != '00') {
dayString = '01';
} else {
dayString = '00';
}
} else {
dayString = day.toString();
}
if (dayString.length < 2) {
dayString = getZero(2 - dayString.length) + dayString;
}
result = replaceString(result, 'dd', dayString);
}
if (hourIndex >= 0) {
var hour = Number(dateTimeString.substr(hourIndex, 2));
if (isNaN(hour) || hour > 23 || hour <= 0) {
hourString = '00';
} else {
hourString = hour.toString();
}
if (hourString.length < 2) {
hourString = getZero(2 - hourString.length) + hourString;
}
result = replaceString(result, 'hh', hourString);
}
if (minuteIndex >= 0) {
var minute = Number(dateTimeString.substr(minuteIndex, 2));
if (isNaN(minute) || minute > 59 || minute <= 0) {
minuteString = '00';
} else {
minuteString = minute.toString();
}
if (minuteString.length < 2) {
minuteString = getZero(2 - minuteString.length) + minuteString;
}
result = replaceString(result, 'mm', minuteString);
}
if (secondIndex >= 0) {
var second = Number(dateTimeString.substr(secondIndex, 2));
if (isNaN(second) || second > 59 || second <= 0) {
secondString = '00';
} else {
secondString = second.toString();
}
if (secondString.length < 2) {
secondString = getZero(2 - secondString.length) + secondString;
}
result = replaceString(result, 'ss', secondString);
}
return result;
}
function normalizeInput(mask, oldValue, newValue, cursorPosAfterChange) {
// 修改前、修改后的数据,分解为数组
var valArr = Array.prototype.slice.call(oldValue);
var newValArr = Array.prototype.slice.call(newValue);
if (newValArr.length > valArr.length) {
// ----------------------------录入
var cursorPosBeforeChange = cursorPosAfterChange - 1; // 限制录入的最大长度
if (cursorPosBeforeChange >= mask.length) {
return;
} // 取录入的字符
var charTypedIn = newValArr[cursorPosBeforeChange];
if (!isValidChar(charTypedIn)) {
// 錄入非法字符,保持光標位置不變
return {
value: oldValue,
cursorPos: cursorPosBeforeChange
};
} else if (isDecollator(charTypedIn)) {
// 分隔符
// 取原始数据光标处的字符
var valCursorPosChar = valArr[cursorPosBeforeChange];
var newCursorPos = null;
if (isDecollator(valCursorPosChar)) {
// 若原始光标位置也是分隔符,直接移动光标跳过
newCursorPos = cursorPosBeforeChange + 1;
} else {
// 保持不动
newCursorPos = cursorPosBeforeChange;
}
return {
value: oldValue,
cursorPos: newCursorPos
};
} else {
// 取原始数据光标处的字符
var _valCursorPosChar = valArr[cursorPosBeforeChange];
var _newCursorPos = null;
var _newValue = null;
if (isDecollator(_valCursorPosChar)) {
// 这里跳过分隔符,替换下一个元素
valArr[cursorPosBeforeChange + 1] = charTypedIn; // 光标前移2个单位
_newValue = formatDateTime(mask, valArr.join(''));
_newCursorPos = cursorPosBeforeChange + 2;
} else {
// 直接替换
valArr[cursorPosBeforeChange] = charTypedIn; // 光标前移1个单位
_newValue = formatDateTime(mask, valArr.join(''));
_newCursorPos = cursorPosBeforeChange + 1;
}
return {
value: _newValue,
cursorPos: _newCursorPos
};
}
} else if (newValArr.length < valArr.length) {
// ----------------------------删除
var deletedCharNums = valArr.length - newValArr.length;
var charBeginPosToDelete = cursorPosAfterChange;
for (var i = 0; i < deletedCharNums; i++) {
valArr[charBeginPosToDelete + i] = '0';
}
var _newValue2 = formatDateTime(mask, valArr.join(''), false);
return {
value: _newValue2,
cursorPos: charBeginPosToDelete
};
} else {
// ----------------------------修改
console.log('理论上只有 insert 模式会走到这个分支...');
}
}
function setCursor(ele, cursorPos) {
ele.focus();
ele.setSelectionRange(cursorPos, cursorPos);
}
function isEmptyDate(mask, eleValue) {
validDateTime(mask, eleValue);
var yearIndex = mask.search('yyyy');
var monthIndex = mask.search('MM');
var dayIndex = mask.search('dd');
var hourIndex = mask.search('hh');
var minuteIndex = mask.search('mm');
var secondIndex = mask.search('ss');
var year = 0,
month = 0,
day = 0,
hour = 0,
minute = 0,
second = 0;
if (yearIndex >= 0) {
year = new Number(eleValue.substr(yearIndex, 4));
}
if (monthIndex >= 0) {
month = new Number(eleValue.substr(monthIndex, 2));
}
if (dayIndex >= 0) {
day = new Number(eleValue.substr(dayIndex, 2));
}
if (hourIndex >= 0) {
hour = new Number(eleValue.substr(hourIndex, 2));
}
if (minuteIndex >= 0) {
minute = new Number(eleValue.substr(minuteIndex, 2));
}
if (secondIndex >= 0) {
second = new Number(eleValue.substr(secondIndex, 2));
}
if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) {
return true;
}
return false;
}
function validDateTime(mask, eleValue) {
if (eleValue.length > mask.length) {
throw new Error(
'\u5F53\u524D\u5F55\u5165\u503C\u3010'
.concat(eleValue, '\u3011\u4E0E mask\u3010')
.concat(mask, '\u3011\u4E0D\u5339\u914D\uFF0C\u8BF7\u68C0\u67E5\uFF01')
);
}
var yearIndex = mask.search('yyyy');
var monthIndex = mask.search('MM');
var dayIndex = mask.search('dd');
var hourIndex = mask.search('hh');
var minuteIndex = mask.search('mm');
var secondIndex = mask.search('ss');
var year = 0,
month = 0,
day = 0,
hour = 0,
minute = 0,
second = 0;
if (yearIndex >= 0) {
year = new Number(eleValue.substr(yearIndex, 4));
}
if (monthIndex >= 0) {
month = new Number(eleValue.substr(monthIndex, 2));
}
if (dayIndex >= 0) {
day = new Number(eleValue.substr(dayIndex, 2));
}
if (hourIndex >= 0) {
hour = new Number(eleValue.substr(hourIndex, 2));
}
if (minuteIndex >= 0) {
minute = new Number(eleValue.substr(minuteIndex, 2));
}
if (secondIndex >= 0) {
second = new Number(eleValue.substr(secondIndex, 2));
}
if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) {
return;
}
if (
yearIndex >= 0 &&
(isNaN(year) || year == 0 || year < Number(DEFAULT_LEAST_YEAR) || year > Number(DEFAULT_MAX_YEAR))
) {
throw new Error(
'\u5F53\u524D\u5F55\u5165\u503C\u3010'
.concat(eleValue, '\u3011\u7684\u5E74\u3010')
.concat(eleValue.substr(yearIndex, 4), '\u3011\u4E0D\u6B63\u786E\uFF0C\u8BF7\u68C0\u67E5\uFF01')
);
}
if (monthIndex >= 0 && (isNaN(month) || month <= 0 || month > 12)) {
throw new Error(
'\u5F53\u524D\u5F55\u5165\u503C\u3010'
.concat(eleValue, '\u3011\u7684\u6708\u3010')
.concat(eleValue.substr(monthIndex, 2), '\u3011\u4E0D\u6B63\u786E\uFF0C\u8BF7\u68C0\u67E5\uFF01')
);
}
if (dayIndex >= 0 && (isNaN(day) || day <= 0 || day > 31)) {
throw new Error(
'\u5F53\u524D\u5F55\u5165\u503C\u3010'
.concat(eleValue, '\u3011\u7684\u65E5\u3010')
.concat(eleValue.substr(dayIndex, 2), '\u3011\u4E0D\u6B63\u786E\uFF0C\u8BF7\u68C0\u67E5\uFF01')
);
}
if (hourIndex >= 0 && (isNaN(hour) || hour < 0 || hour > 23)) {
throw new Error(
'\u5F53\u524D\u5F55\u5165\u503C\u3010'
.concat(eleValue, '\u3011\u7684\u65F6\u3010')
.concat(eleValue.substr(hourIndex, 2), '\u3011\u4E0D\u6B63\u786E\uFF0C\u8BF7\u68C0\u67E5\uFF01')
);
}
if (minuteIndex >= 0 && (isNaN(minute) || minute < 0 || minute > 59)) {
throw new Error(
'\u5F53\u524D\u5F55\u5165\u503C\u3010'
.concat(eleValue, '\u3011\u7684\u5206\u3010')
.concat(eleValue.substr(minuteIndex, 2), '\u3011\u4E0D\u6B63\u786E\uFF0C\u8BF7\u68C0\u67E5\uFF01')
);
}
if (secondIndex >= 0 && (isNaN(second) || second < 0 || second > 59)) {
throw new Error(
'\u5F53\u524D\u5F55\u5165\u503C\u3010'
.concat(eleValue, '\u3011\u7684\u79D2\u3010')
.concat(eleValue.substr(secondIndex, 2), '\u3011\u4E0D\u6B63\u786E\uFF0C\u8BF7\u68C0\u67E5\uFF01')
);
} //增加对每月日期合法性的判断 2005-03-21
if (day > 28 && day < 31) {
if (month == 2) {
if (day != 29) {
throw new Error(year + '年' + month + '月无' + day + '日,请检查!');
} else {
if (year % 4 != 0) {
throw new Error(year + '年' + month + '月无' + day + '日,请检查!');
} else {
if (year % 100 == 0 && year % 400 != 0) {
throw new Error(year + '年' + month + '月无' + day + '日,请检查!');
}
}
}
}
} else if (day == 31) {
if (month == 2 || month == 4 || month == 6 || month == 9 || month == 11) {
throw new Error(month + '月无' + day + '日,请检查!');
}
}
return;
}
//@ sourceMappingURL=DateMask.js.map