2011-01-26 2 views
8

У меня есть базовая проверка на форме, которая включает в себя два jQuery UI DatePickers. Формат даты - yy-mm-dd. Существует и дате Проверка на обоих DatePickers.Датчик даты на триггере датыPicker ложных негативов в IE7/IE8

Эти функции работают, как ожидается, в 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 приведет к дате ошибка («Недействительная дата. Должен быть отформатирован гггг-мм-дд "). Это не происходит в других браузерах.

Он также не производит никаких ошибок Javascript.

Спасибо заранее,

Ian

ответ

13

Я думаю, что вы ищете 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 просто использует Date.parse или new Date(dateString) для проверки действительности. Чтобы проверить это, попробуйте сделать new Date("1987-11-14") и предупредить значение в IE и FF. Вы получите NaN в IE и объект даты в FF.

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

3

Пример преодолеть IE NaN

var startDate = "1987-11-14"; 
startDate  = startDate.split("-"); 
startDate  = new Date(startDate[0], + startDate[1], startDate[2]); 
alert(startDate); 
1

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

$("#selectorDate").datepicker({ 
    dateFormat: 'mm/dd/yy', 
    altField: "#another_field_date", 
    altFormat: "yy-mm-dd" 
}); 
0

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

<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". Теперь дата корректно проверяется и остается необязательным полем.

0

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