【问题标题】:Jquery Datepicker ChromeJquery Datepicker Chrome
【发布时间】:2011-08-23 09:37:32
【问题描述】:

在使用 jQuery UI Datepicker 时,我们在 Google Chrome 中使用时遇到了一个问题: 当我们输入一个高于 12 天的日期时,它不接受它作为有效日期,这是因为 chrome 认为日期格式是 mm/dd/yyyy。我们尝试通过添加代码来尝试将日期设置强制为 dd/mm/yyyy 来解决这个问题

$('.date').datepicker({ dateFormat: "dd/mm/yy" });

有没有办法解决这个问题,所以我们的日期选择器将接受 dd/mm/yyyy 值? 我们只在 google Chrome 中遇到这个问题,datefix 适用于 firefox,ie & safari。 我们在这个项目中使用 ASPX 和 MVC3。

如果有人能解决我们的问题,那就太好了

谢谢

【问题讨论】:

标签: jquery jquery-ui asp.net-mvc-3 datetimepicker


【解决方案1】:

您必须使用“en-GB”日期验证覆盖默认的“en-US”日期验证。

  • 'en-US' => 'mm/dd/yy'
  • 'en-GB' => 'dd/mm/yy'

解决方案:

在您的项目中添加一个“jquery.validate.date.js”文件,并在其中放入以下代码:

//To Fix jQuery date format 'en-GB' validation problem in Chrome
$(function () {
    $.validator.addMethod(
        "date",
        function (value, element) {
            var bits = value.match(/([0-9]+)/gi), str;
            if (!bits)
                return this.optional(element) || false;
            str = bits[1] + '/' + bits[0] + '/' + bits[2];
            return this.optional(element) || !/Invalid|NaN/.test(new Date(str));
        },
        "Please enter date in valid format [dd/mm/yyyy]"
    );
});

并确保它在 'jquery.validate.min.js' 之后加载:

<script type="text/javascript" src="/Scripts/jquery-3.1.0.min.js"></script>
<script type="text/javascript" src="/Scripts/jquery.validate.min.js"></script>
<script type="text/javascript" src="/Scripts/jquery.validate.date.js"></script>

【讨论】:

    【解决方案2】:

    上述解决方案不起作用,因为不推荐使用 jquery 浏览器检查抛出 jquery.validate.min.js Uncaught TypeError: Cannot read property 'webkit' of undefined. Exception occurred when checking element DateOfBirth, check the 'date'

    在我的项目中,我使用momentjsbootstrap datetimepicker,所以这个解决方案效果很好:

     $(function () {
        $.validator.methods.date = function (value, element) {
            return this.optional(element) || moment(value, 'DD/MM/YYYY').isValid();
      };
    });
    

    加载后立即调用jquery.validate()

    【讨论】:

    • 很高兴听到这个消息!请分享爱并投票给答案@user3284707
    【解决方案3】:

    创建一个新的 jquery.validate.date.js 文件。

    将以下代码粘贴到文件中。

     $(function () {
        $.validator.methods.date = function (value, element) {
          if ($.browser.webkit) {
            var d = new Date();
            return this.optional(element) || !/Invalid|NaN/.test(new Date(d.toLocaleDateString(value)));
          }
          else {
            return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
        }
      };
    });
    

    现在确保在 jquery.validate.js 文件之后加载此文件。

    【讨论】:

    • 我正面临着确切的问题,您的脚本对我来说效果很好..但我不确定您的脚本到底是做什么的?它有什么限制吗?
    • 代码首先检查浏览器。 if 条件适用于 chrome,否则适用于其他浏览器。由于 Chrome 在实例化新 Date 对象时不使用语言环境,这就是为什么 .toLocaleDateString(value) 用于 chrome 而其他浏览器不介意。
    • 您是否复制粘贴了这个 2011 年编写的解决方案? stackoverflow.com/a/7878085/80434
    • @Korayem 如果我复制/粘贴了解决方案,那么我没有像上面那样解释答案。所以冷静
    【解决方案4】:
     $.validator.methods.date = function (value, element) {                
                if ($.browser.webkit) {                    
                    var d = value.split("/");   
                    return this.optional(element) || !/Invalid|NaN/.test(new Date((/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())) ? d[1] + "/" + d[0] + "/" + d[2] : value));
                  }
                else {
                    return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
                }
            };
    

    【讨论】:

    • 感谢 Chtiwi Malek 提供您的代码。这段代码在 chrome 和 firefox 中对我有用。
    • 我收到错误jquery.validate.min.js Uncaught TypeError: Cannot read property 'webkit' of undefined. Exception occurred when checking element DateOfBirth, check the 'date' method.
    【解决方案5】:

    我遇到了同样的问题,并且与所有基于 Webkit 的网络浏览器有关。如果您设置大写 M,则文本框会显示带有字母的飞蛾。对我来说最好的解决方案是覆盖 jquery.validate.js 中的验证日期函数

    创建 jquery.validate.date.js 并确保它在 jquery.validate.js 之后加载

    将以下代码添加到 jquery.validate.date.js

    $(function() {
        $.validator.methods.date = function (value, element) {
            if ($.browser.webkit) {
    
                //ES - Chrome does not use the locale when new Date objects instantiated:
                var d = new Date();
    
                return this.optional(element) || !/Invalid|NaN/.test(new Date(d.toLocaleDateString(value)));
            }
            else {
    
                return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
            }
        };
    });
    

    【讨论】:

    • new Date(d.toLocaleDateString(value)) 将始终是当前日期并且不反映值字符串。
    • 这为我省去了几个小时的麻烦 :)
    • 请记住 $.browser 已被 JQuery 1.9 弃用和删除 api.jquery.com/jQuery.browser
    • 这对我不起作用,toLocalDateString 生成“Uncaught RangeError: Invalid language tag: 30/08/2013”​​
    • jquery.validate.js 这个代码我已经有了,还是不行,MarkB提到的同样的错误
    【解决方案6】:

    user1011138 解决方案对我不起作用,因为 .toLocaleDateString(value) 不解析 value 字符串

    这是我想出的解决方案 => 在 jquery.validate.js 中找到这个函数定义:“日期:函数(值,元素)”并将代码替换为:

    // http://docs.jquery.com/Plugins/Validation/Methods/date
    date: function (value, element) {
        var d = value.split("/");
        return this.optional(element) || !/Invalid|NaN/.test(new Date((/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())) ? d[1] + "/" + d[0] + "/" + d[2] : value));
    },
    

    【讨论】:

    • 请务必在行尾调整数组的格式,但这对我有用,谢谢
    • 有一个问题,我如何让它验证 31 天和 12 个月和年?有可能吗?
    • 解决了这个问题。基本上,问题与chromechromiun 有关。这个问题是用 jquery 1.8+ 确定的。我认为这是一个临时修复,因为取决于最新的 jquery 更新。谢谢@Chtiwi Malek
    • 这也对我有用。花了半天时间试图在“全局”层面寻找解决方案
    • 感谢您的解决方案。我尝试了接受的答案,但它给了我无效的语言错误,所以我尝试了你的。它工作正常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多