it-roy-ru.com

Ненавязчивая проверка в Chrome не будет проверяться с помощью дд / мм / гггг

Я пытаюсь использовать самый простой из возможных сценариев с использованием выбора даты в разных браузерах. Я подозреваю, что делаю что-то очень простое неправильно, но после долгих поисков я так и не нашел решения. Ниже приведен пример кода, который представляет то, что я пытаюсь.

Если я использую Chrome (v12.0.742.122) и выбираю дату из средства выбора, например 13/08/2011, логика проверки jQuery не разрешит отправку страницы, даже если я явно указал формат как "дд/мм/гг".

Если я изменю формат на 'dd/M/yy' и выберу дату, например, 13 августа 2011 года, она будет работать в Chrome, но не будет отправлена ​​мне в IE ( v8.0.7600.16385). В FireFox (v3.6.18) оба формата работают.

Какой сценарий проверки мне нужен, чтобы иметь возможность поддерживать форматы даты 'dd/mm/yy' в Chrome?

<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>
53
sipwiz

Четыре часа спустя я наконец наткнулся на ответ . По какой-то причине Chrome, похоже, имеет некоторую встроенную склонность использовать американские форматы дат, где IE и ​​FireFox могут быть разумными и использовать региональные настройки в ОС.

jQuery.validator.methods["date"] = function (value, element) { return true; } 
49
sipwiz

Вы можете использовать плагин 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");
}
48
magritte

Я знаю, что немного опоздал на вечеринку, но вот решение, которое я использовал для Chrome проверки, не принимающей даты в британском формате. Простая проверка подключи и играй, она не зависит от каких-либо плагинов или изменения каких-либо файлов. Он будет принимать любую дату в период с 01.01.1900 по 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);
};
22
webdevduck

Похоже, эта проблема была поднята с командой JQuery.

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

Похоже, что обходной путь на данный момент заключается в использовании dateITA в Additional-method.js

Это выглядит так:

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"
);

Если вы добавите этот валидатор, вы можете присоединить свой указатель даты к классу .dateITA.

До сих пор это помогло мне выйти за рамки этой глупой проблемы в Chrome.

18
mezoid

Это остается проблемой в .net mvc4, где EditorForDateTime по-прежнему создает атрибут data-val-date, несмотря на то, что в плагине проверки правильности jQuery нет четкой документации об его использовании !!! Надеюсь, Microsoft исправит это, и data-val-date больше никогда не услышат!

В то же время вы можете использовать предлагаемую библиотеку через modernizr:

yepnope({
    test: isNaN(Date.parse("23/2/2012")),
    nope: 'http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/additional-methods.min.js',
    complete: function () {
        $.validator.methods.date = $.validator.methods.dateITA
    }
});

или если вы не хотите использовать yepnope/modernizr и избавиться от UTC-компонента метода dateITA (при использовании этой библиотеки для ввода местного времени даты не всегда будут проверяться в 1-й или последний день месяца, если только Гринвичская линия - то есть UTC +0):

(function ($) {
    var invokeTestDate = function () {
        return $.validator.methods.date.call({
            optional: function () {
                return false;
            }, (new Date(2012,8,23)).toLocaleDateString(), null);
    };
    if (invokeTestDate()) {
        return;
    }

    // http://docs.jquery.com/Plugins/Validation/Methods/date

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

Мы используем следующие для работы над нашими проектами;

if ($.validator) {
    $.validator.addMethod("date",
        function (value, element, params) {
            if (this.optional(element)) {
                return true;
            }

            var ok = true;
            try {
                $.datepicker.parseDate("dd/mm/yy", value);
            }
            catch (err) {
                ok = false;
            }
            return ok;
        });
}
2
DiskJunky

Пусть этот код поможет вам.

$.validator.addMethod(
         "date",
         function(value, element) {
              var check = false;
              var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
              var reBR = /^\d{4}\-\d{1,2}\-\d{1,2}$/;
              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 if( reBR.test(value)){
                   var adata = value.split('-');
                   var aaaa = parseInt(adata[0],10);
                   var mm = parseInt(adata[1],10);
                   var gg = 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;
                   console.log(check);
              return this.optional(element) || check;
         },
         "Por favor insira uma data válida"
    );
1
user2715347

Я также нашел решение, которое, кажется, работает для любой культуры.

http://devdens.blogspot.com/2011/11/jquery-validation-fix-for-date-format_29.html

Это требует от вас изменения самого файла jquery.valdiation.min.js, но пока он работает для меня.

0
aaron

следует изменить метод dateRule, который вы определили в validate, на (например, регулярное выражение является простым):

$.validator.addMethod(
    "dateRule",
    function(value, element) {
        return value.match(/^\d\d?\/\d\d?\/\d\d$/);
    },
    "Please enter a date in the format dd/mm/yy"
);

вы можете переключить регулярное выражение для чего угодно. Я получил это регулярное выражение для даты от здесь , который поддерживает M/D/YY или M/D/YYYY или MM/DD/YYYY или MM/DD/YY: с 01.01.1920 по 12/31/2019; 29 и 30 февраля всегда разрешено

^((0?[13578]|10|12)(-|\/)(([1-9])|(0[1-9])|([12])([0-9]?)|(3[01]?))(-|\/)((19)([2-9])(\d{1})|(20)([01])(\d{1})|([8901])(\d{1}))|(0?[2469]|11)(-|\/)(([1-9])|(0[1-9])|([12])([0-9]?)|(3[0]?))(-|\/)((19)([2-9])(\d{1})|(20)([01])(\d{1})|([8901])(\d{1})))$
0
Calvin

Или мы можем попытаться переписать валидатор, а не игнорировать его.

$.validator.addMethod("date", function (value, element) {
    var result = true;
    try {
        $.datepicker.parseDate('dd/mm/yy', value);
    }
    catch (err) {
        result = false;
    }
    return result;
});
0
Kevin Wong

Я обнаружил, что самым простым исправлением этой ошибки является следующий фрагмент кода после вызова файла проверки;

    jQuery.validator.methods["date"] = function (value, element){
        var shortDateFormat = "dd/mm/yy";
        var res = true;
        try {
            $.datepicker.parseDate(shortDateFormat, value);
        } catch (error) {
            res = false;
        }
        return res;
    }

Даже в версиях, найденных в 2016 году, у меня все еще есть эта проблема без кода выше в Chrome, а не в Firefox.

Это мое предпочтительное решение, так как оно не требует никаких дополнительных библиотек или плагинов для работы.

Я нашел этот фрагмент кода, пока гуглил проблему здесь.

0
Tarquin

Это единственное решение, которое сработало для меня: http://www.codeproject.com/Tips/579279/Fixing-jQuery-non-US-Date-Validation-for-Chrome

 jQuery.extend(jQuery.validator.methods, {
        date: function (value, element) {
            var isChrome = window.chrome;
            // make correction for chrome
            if (isChrome) {
                var d = new Date();
                return this.optional(element) || 
                !/Invalid|NaN/.test(new Date(d.toLocaleDateString(value)));
            }
            // leave default behavior
            else {
                return this.optional(element) || 
                !/Invalid|NaN/.test(new Date(value));
            }
        }
    }); 
0
Jodda