Chrome中的不显眼验证无法使用dd/mm/yyyy进行验证

sip*_*wiz 53 jquery jquery-ui datepicker jquery-validate unobtrusive-validation

我正在尝试使用不同浏览器中使用日期选择器的最简单方案.我怀疑我做的事情非常简单,但是经过大量的搜索,我仍然没有找到解决方案.下面是一些代表我正在尝试的示例代码.

如果我使用Chrome(v12.0.742.122)并从选择器中选择日期,例如13/08/2011,即使我已明确指定格式为'dd/mm /,jQuery验证逻辑也不允许页面提交YY".

如果我将格式更改为'dd/M/yy'并选择类似13/Aug/2011的日期,则可以在Chrome中使用,但之后不会在IE中提交(v8.0.7600.16385).在FireFox(v3.6.18)中,两种格式都有效.

我需要哪些验证脚本才能支持Chrome中'dd/mm/yy'的日期格式?

<html>
 <head>
  <link rel="stylesheet" type="text/css" href="jquery-ui.css" />
  <script type="text/javascript" src="jquery-1.4.4.js"></script>
  <script type="text/javascript" src="jquery.validate.js"></script>
  <script type="text/javascript" src="jquery.validate.unobtrusive.js"></script>
  <script type="text/javascript" src="jquery-ui.js"></script>
  <script type="text/javascript">
      $(document).ready(function () {
    $('.date').datepicker({ dateFormat: 'dd/mm/yy' });
            $.validator.addMethod("dateRule", function(value, element) {
      return true;
    },
    "Error message");
      });
  </script>
 </head>
 <body>
    <form>
        Date: <input type="text" name="myDate" class="date dateRule" />
        <input type="submit" />
    </form>
 </body>
</html>
Run Code Online (Sandbox Code Playgroud)

sip*_*wiz 49

四个小时后,我终于偶然发现了答案.出于某种原因,Chrome似乎有一些内置的偏好使用美国日期格式,其中IE和FireFox能够合理并使用操作系统上的区域设置.

jQuery.validator.methods["date"] = function (value, element) { return true; } 
Run Code Online (Sandbox Code Playgroud)

  • 这是日期格式验证器还是只是"我不关心"? (32认同)
  • 这忽略了验证!! 你是认真的吗 ?! (21认同)
  • 这不清楚日期验证吗? (9认同)
  • 我花了大约一个小时才找到你的答案.这行代码完美无缺. (3认同)
  • “IE 和 FireFox”不要使用操作系统上的_区域设置_ - 只是如果您输入“76/85/2015”,即使它不是有效日期,它们也会生成一个日期。只有 Chome 正确地将其报告为无效日期。这个答案意味着你永远不会得到客户端验证。 (2认同)

mag*_*tte 49

您可以使用此处提供的Globalize.js插件:https://github.com/jquery/globalize

然后简单地在网站的主脚本文件中重新定义validate方法(避免编辑jquery.validate.js库文件,因为您可能希望将来更新它):

$.validator.methods.date = function (value, element) {
    return this.optional(element) || Globalize.parseDate(value, "d/M/y", "en");
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该被视为答案.+1 (7认同)
  • 对于其他寻找这个的人......应该有一个很大的"M",即"d/M/y"作为一个小的表示分钟,当它不应该工作时! (3认同)

小智 22

我知道我参加聚会有点晚了,但这是我用来验证Chrome验证不接受英国格式约会的解决方案.一个简单的即插即用验证,它不依赖于任何插件或修改任何文件.它将接受19/1/19和31/31/2999之间的任何日期,所以美国或英国格式.显然有无效的日期将会过去,但你可以调整正则表达式的内容.这符合我的需求,因为它将用于站点的低流量区域,并具有服务器端验证.有问题的网站区域是使用ASP.net MVC构建的.

jQuery.validator.methods.date = function(value, element) {
    var dateRegex = /^(0?[1-9]\/|[12]\d\/|3[01]\/){2}(19|20)\d\d$/;
    return this.optional(element) || dateRegex.test(value);
};
Run Code Online (Sandbox Code Playgroud)

  • 实际上,使那个var dateRegex =/^(0?[1-9] | [12]\d | 3 [01])\ /(0?[1-9] | 10 | 11 | 12)\ /(19 | 20)\ d\d(\ d*)$ /.?; 现在它只支持一个日期(我正在处理日期时间)的情况下不支持尾随字符 (3认同)
  • 我使用了一个比这个更复杂的正则表达式,但是比另一个答案中的大量复制品更复杂.它不检查字符串的结尾,以便允许时间跟随.var dateRegex =/^(0?[1-9] | [12]\d | 3 [01])\ /(0?[1-9] | 10 | 11 | 12)\ /(19 | 20)\ d\d\d /; 超出范围的问题由日期或日期时间选择器的约束处理. (2认同)

mez*_*oid 18

看起来这个问题已经与JQuery团队一起提出.

https://github.com/jzaefferer/jquery-validation/issues/153

看起来现在的解决方法是在additional-methods.js中使用dateITA

它看起来像这样:

jQuery.validator.addMethod(
    "dateITA",
    function(value, element) {
        var check = false;
        var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
        if( re.test(value)){
            var adata = value.split('/');
            var gg = parseInt(adata[0],10);
            var mm = parseInt(adata[1],10);
            var aaaa = parseInt(adata[2],10);
            var xdata = new Date(aaaa,mm-1,gg);
            if ( ( xdata.getFullYear() == aaaa ) 
                   && ( xdata.getMonth () == mm - 1 ) 
                   && ( xdata.getDate() == gg ) )
                check = true;
            else
                check = false;
        } else
            check = false;
        return this.optional(element) || check;
    },
    "Please enter a correct date"
);
Run Code Online (Sandbox Code Playgroud)

如果添加该验证器,则可以将日期选择器附加到".dateITA"类.

到目前为止,这对我来说非常有效,让我超越Chrome中的这个愚蠢问题.