jQuery Validation 日期格式 dd/MM/yyyy 验证不通过
ZKEASOFT July 18, 2017
jQuery Validation 日期格式 dd/MM/yyyy 验证不通过这个问题要怎么解决呢?首先我们要找到 jQuery Validation 验证日期的代码:
// http://jqueryvalidation.org/date-method/ date: function( value, element ) { return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() ); }
失败的原因主要是因为 new Date("dd/MM/yyyy") 不支持这种日期格式。
扩展修改
问题找到了,怎么改比较好呢,直接从源代码修改也是可以,但是一但更新这个插件,你的修改就会被覆盖,说不定还得再来一遍。我们可以通过扩展、覆盖原有的验证方法来重写原有的验证方法:
$.extend($.validator.methods, { date: function (value, element) { } });
按日期格式来转换
日期格式总不是固定一尘不变的,需要写一个方法来按格式转日期。如果你不想自己写,可以使用现成的插件,例如 moment.js
这里我们简单的写一个 parseDate 方法来实现:
$.extend($.validator.methods, { date: function (value, element) { function parseDate(date, format) { var year = 0, month = 0, day = 0, hour = 0, minute = 0, seconds = 0; function toNumber(n) { if (n == '') { return -1; } return Number(n); } function yearSetter(y, p) { if (y < 1000) { y += 2000; } else if (y < 1899) { return false; } year = y; return true; } function monthSetter(m, p) { if (m < 1 || m > 12) { return false; } month = m - 1; return true; } function daySetter(d, p) { if (d < 1 || d > 31) { return false; } day = d; return true; } function hourSetter(h, p) { if (h < 0 || h > 23) { return false; } hour = h; return true; } function minuteSetter(m, p) { if (m < 0 || m > 59) { return false; } minute = m; return true; } function secondsSetter(s, p) { if (s < 0 || s > 59) { return false; } seconds = s; return true; } var setterMap = { "y": yearSetter, "yy": yearSetter, "yyy": yearSetter, "yyyy": yearSetter, "M": monthSetter, "MM": monthSetter, "d": daySetter, "dd": daySetter, "h": hourSetter, "hh": hourSetter, "H": hourSetter, "HH": hourSetter, "m": minuteSetter, "mm": minuteSetter, "s": secondsSetter, "ss": secondsSetter }; var split = '-'; var length = format.length; for (var index = 0; index < length; index++) { var element = format[index]; if (setterMap[element]) continue; if (date.indexOf(element) >= 0) { date = date.replace(element, split); format = format.replace(element, split); } } var formatArray = format.split(split); var dateArray = date.split(split); for (var i = 0; i < formatArray.length; i++) { var part = formatArray[i]; if (!part) continue; var setter = setterMap[part]; if (setter) { var num = toNumber(dateArray[i]); if (num >= 0) { if (setter(num, part)) { continue; } } } return null; } return new Date(year, month, day, hour, minute, seconds); } return this.optional(element) || !/Invalid|NaN/.test(new Date(value).toString()) || parseDate(value,$(element).data("format")); } );