Валидатор даты на DatePicker вызывает ложные отрицания в IE7 / IE8 - PullRequest
8 голосов
/ 26 января 2011

У меня есть некоторая базовая проверка в форме, которая включает в себя два jQuery UI DatePickers.Формат даты - гг-мм-дд.Существует проверка на требуется и date для обоих DatePickers.

Они работают, как и ожидалось, в Chrome и FF, но вызывают ложные отрицания (допустимый ввод считается неверным) в IE7 / IE8.

Настройка выбора даты:

$('.datepicker').datepicker({
    dateFormat: 'yy-mm-dd'
});

Это не связано, но я подумал, что я бы включил, на всякий случай:

$.validator.addMethod("endDate", function(value, element) {
    var startDate = $('#startDate').val();
    return Date.parse(startDate) <= Date.parse(value);
});

Фактическая проверка:

$('#ExampleForm').validate({
    rules: {    
        StartDate: {
            required: true,
            date: true
        },
        EndDate: {
            required: true,
            date: true,
            endDate: true
        }
    },
    messages: {
        StartDate: {
            required: "Start Date required",
            date: "Invalid date. Must be formatted yyyy-mm-dd"
        },
        EndDate: {
            required: "End Date required",
            date: "Invalid date. Must be formatted yyyy-mm-dd",
            endDate: "Start date must occur before end date."
        }
    },
    errorPlacement: function(error, element) {
        error.appendTo(element.parent().next());
    },
    submitHandle: function(form) {
        form.submit();
    }
});

В IE7 / IE8, допустимый ввод (просто выбирая дату) с обоими DatePickers приведет к ошибке date («Неверная дата. Должен быть отформатирован гггг-мм-дд»).Это не происходит в других браузерах.

Он также не вызывает ошибок Javascript.

Заранее спасибо,

Ian

Ответы [ 5 ]

13 голосов
/ 27 января 2011

Я думаю, что вы ищете вариант dateISO:

$('form').validate({
    rules: {
        StartDate: {
            required: true,
            dateISO: true
        },
        EndDate: {
            required: true,
            dateISO: true
        }
    },
    messages: {
        StartDate: {
            required: "Start Date required",
            dateISO: "Invalid date. Must be formatted yyyy-mm-dd"
        },
        EndDate: {
            required: "End Date required",
            dateISO: "Invalid date. Must be formatted yyyy-mm-dd"
        }
    },
    submitHandler: function(form) {
        form.submit();
    }
});

IE не будет анализировать даты в формате yyyy-mm-dd, поэтому используется обычный date терпит неудачу в IE.Я полагаю, что jQuery validate просто использует Date.parse или new Date(dateString) для проверки действительности.Чтобы проверить это, попробуйте сделать new Date("1987-11-14") и оповестить значение в IE и FF.Вы получите NaN в IE и объект даты в FF.

Вот рабочий пример: http://jsfiddle.net/andrewwhitaker/QqSrJ/2/

3 голосов
/ 27 мая 2011

Пример преодоления ИЭ NaN

var startDate   = "1987-11-14";
startDate       = startDate.split("-");
startDate       = new Date(startDate[0], + startDate[1], startDate[2]);
alert(startDate);
1 голос
/ 13 сентября 2011

Отправьте дату в нужном вам формате в скрытое поле в вашей форме, используя altField и altFormat, это исправило мои ошибки NaN.

$("#selectorDate").datepicker({
    dateFormat: 'mm/dd/yy',
    altField: "#another_field_date",
    altFormat: "yy-mm-dd"
});
0 голосов
/ 04 сентября 2014

В моем случае атрибут class = "date" (не type = "date") в поле ввода заставлял валидатор автоматически добавлять валидацию даты в поле, что вызывало ложный минус в IE8.Поэтому я изменил класс на «выбор даты», а затем использовал правило dateISO, как в ответе Эндрю Уитакера.

0 голосов
/ 08 ноября 2013

У меня была проблема в моем собственном коде, где формат даты был таким же, как описано выше, и форма в JSP (с небольшой помощью тегов формы Spring) выглядела так:

<fmt:formatDate pattern="yyyy-MM-dd" value="${user.dateOfBirth}" var="dob"/>
<form:input id="date-of-birth" type="date" path="dateOfBirth" value="${dob}"/>  

Проблема заключалась в том, что поле даты было необязательным (обязательно = false в правилах проверки JQuery), но оно использовало DatePicker и, таким образом, проверялось автоматически при его заполнении. Проблема заключалась в том, что во всех браузерах и в IE9 (и более поздних версиях) проверка выполнялась правильно, но в IE8 это приводило к остановке проверки «недопустимой даты».

Я играл с правилами проверки jquery, пытался использовать dateISO (хотя я ни в коем случае не говорю, что это решение не подойдет для некоторых), но безрезультатно.

Оказывается, что в моем случае все, что мне нужно было сделать, это удалить атрибут 'type = "date"'. Теперь дата проверяется правильно и остается необязательным полем.

...