我使用Jquery Validation插件并验证事件日期,如
rules:{
eventdate:
{
required:true,
date: true
}
}
日期格式类似于“23 / August / 2013”('dd / MM / yy')
但代码在 Safari 上失败,在Fx,chrome,opera等方面效果更好......
是Safari Bug还是Jquery Validation插件错误?
我知道Jquery Validation插件支持自定义验证,如
$.validator.addMethod("customdateValidateRule", function(value, element)
{
_isvalidResult=****testfn()***;
return _isvalidResult;
}
我试过Custom date format with jQuery validation plugin
但是dd/mm/yyyy
不是('dd/MM/yy')
,而是23/August/2013"
的正则表达式,我不知道!
说明
1)我使用Datepicker(JqueryUi)来选择日期
2)我正在使用Jquery Validation插件(最新版),它将验证很多日期格式,它也验证了“23 / August / 2013”(我假设)但是当我在Safari中测试它时显示无效在FX,Chrome,Opera中显示“有效”的地方..
答案 0 :(得分:4)
问题是因为Safari无法正确处理格式。 JQuery验证插件工具无法验证此格式(仅在Chrome
和Safari
中发生)。要解决此问题,请修改验证插件。
如果您想为dd/mm/yy
自定义,可以这样做。
$.validator.addMethod(
"customdateValidateRule",
function(value, element) {
return value.match(/^\d{1,2}\/\d{1,2}\/\d{2}$/);
},
"Input a date format of dd/mm/yy:"
);
并将规则验证添加到表单中。
$('#myformname')
.validate({
rules : {
myDate : {
customdateValidateRule : true
}
}
});
如果您想要添加测试方法,您应该可以执行类似..
的操作var isdate = function(value) {
var isvalid = /^(\d{1,2})\/(\d{1,2})\/(\d{2})?$/;
return isvalid.test(value);
}
$.validator.addMethod(
"customdateValidateRule",
function(value, element) {
return isdate(value);
}
);
如果您需要正则表达式来验证dd/mm/yyyy
,请将其更改为..
/^\d{1,2}\/\d{1,2}\/\d{4}$/
要验证23/August/2013
日期的具体信息,您可以在此处选择几个选项。
有简短的方法:
/^\d{1,2}\/\b[a-zA-Z]+\/\d{4}$/
正则表达式解释:
^ the beginning of the string
\d{1,2} digits (0-9) (between 1 and 2 times)
\/ look for and match '/'
\b the boundary between a word char (\w)
[a-zA-Z]+ any character of: 'a' to 'z', 'A' to 'Z' (1 or more times)
\/ look for and match '/'
\d{4} digits (0-9) (4 times)
$ before an optional \n, and the end of the string
漫长的路(具体验证):
/^\d{1,2}\/\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|
May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sept?|September|
Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\/\d{4}$/
正则表达式解释:
^ the beginning of the string
\d{1,2} digits (0-9) (between 1 and 2 times)
\/ look for and match '/'
\b the boundary between a word char (\w)
(?: group, but do not capture:
Jan(?:uary)?| 'Jan', group but don't capture optional 'uary', OR
Feb(?:ruary)?| 'Feb', group but don't capture optional 'ruary', OR
Mar(?:ch)?| 'Mar', group but don't capture optional 'ch', OR
Apr(?:il)?| 'Apr', group but don't capture optional 'il', OR
May| 'May', OR
Jun(?:e)?| 'Jun', group but don't capture optional 'e', OR
Jul(?:y)?| 'Jul', group but don't capture optional 'y', OR
Aug(?:ust)?| 'Aug', group but don't capture optional 'ust', OR
Sept?| 'Sep', 't' optional, OR
September| 'September', OR
Oct(?:ober)?| 'Oct', group but don't capture optional 'ober', OR
Nov(?:ember)?| 'Nov', group but don't capture optional 'ember', OR
Dec(?:ember)? 'Dec', group but don't capture optional 'ember'
) end of grouping
\/ look for and match '/'
\d{4} digits (0-9) (4 times)
$ before an optional \n, and the end of the string
答案 1 :(得分:3)
如你所说,如果你正在使用JqueryUi Datepicker
,你有2种方法
1)正如@hwnd所说,你必须编辑验证器插件
2)只需添加我的黑客并对它感到满意!
/*Override the validator's Date Validation with mine! */
$.validator.methods.date=
function(value, element) {
try{
var _appleDates=$.datepicker.formatDate("mm/dd/yy",$.datepicker.parseDate("dd/MM/yy",value));
return (!/Invalid|NaN/.test(new Date(_appleDates).toString()));
}catch(e){return false;};
};
然后按照您的说法使用
rules:{
eventdate:
{
required:true,
date: true
}
}
谢谢你快乐!