Подтвердить что ты не робот

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

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

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

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

Какая проверка script нужна ли мне поддержка форматов даты в формате "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>
4b9b3361

Ответ 1

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

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

Ответ 2

Вы можете использовать плагин Globalize.js, доступный здесь: https://github.com/jquery/globalize

Затем просто переопределите метод проверки в основном файле script вашего веб-сайта (не редактируйте файл библиотеки jquery.validate.js, как вы можете его обновить в будущем):

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

Ответ 3

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

Ответ 4

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

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

Похоже, что обходным путем является использование dateITA в additional-methods.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"
);

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

До сих пор это работало хорошо для меня, чтобы вывести меня за пределы этой глупой проблемы в Chrome.

Ответ 5

Это остается проблемой в .net mvc4, где EditorFor DateTime все еще создает атрибут 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 (если эта библиотека используется для ввода локального времени, даты не всегда проверяются в первый или последний день месяца если только на линии Гринвича - то есть 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);

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

$.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: 1/1/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})))$

Ответ 10

Это единственное решение, которое сработало для меня: 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));
            }
        }
    }); 

Ответ 11

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

    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.

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

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