Проверка даты между несколькими датами в jQuery.validate и datepicker - PullRequest
1 голос
/ 21 сентября 2010

Я использую jQuery.datepicker и jQuery.validate.В моей форме у меня есть несколько диапазонов дат:

2010-02-10 - 2010-02-18
2010-03-01 - 2010-03-12
2010-03-15 - 2010-03-19

и т. Д.

Теперь мне нужно проверить поле datepicker, чтобы проверить, находится ли дата, установленная в указателе даты, между любым из этих диапазонов дат,Например, 2010-01-01 будет недействительным, как и 2010-02-19.

Я видел много ответов, но, насколько я понимаю, они не относятся к нескольким диапазонам.

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

1 Ответ

1 голос
/ 07 января 2011

Твой вопрос - это то, что я тоже пытался выяснить некоторое время.Это то, что у меня есть.

Я использую это для проверки одного диапазона дат.Он принимает поля ввода как параметры, а не как даты:

jQuery.validator.addMethod("rangeDate", function(value, element, params) {
    try {
        var beforedate=$.datepicker.parseDate($(params[0]).datepicker('option','dateFormat'),$(params[0]).val());
        var afterdate=$.datepicker.parseDate($(params[1]).datepicker('option','dateFormat'),$(params[1]).val());
        var qdate=$.datepicker.parseDate($(element).datepicker('option','dateFormat'),value);
        return this.optional(element) || (qdate >= beforedate && qdate<=afterdate);
    } catch(err){
        return false;
    }
}, function(params){
    return "Date must occur between " + $(params[0]).val() + ' and ' + $(params[1]).val();
}
);

, и правило выглядит так:

rules:{
  between_date: { dateCan: true, 
         rangeDate:  {
            depends: function(element) { //check that params exist
                return $("input[name='before_date']").valid()
                       && $("input[name='after_date']").valid();
            },
            param:  ["input[name='before_date']", "input[name='after_date']"]
         }
  }
}

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

Конечно, если диапазоны дат не являются динамическими, проблема будет проще, потому что нет необходимости в предложении depends,Просто перепишите rangeDate, чтобы принимать даты, а не поля, и напишите правило обертки, чтобы принять массив пар дат.

Если вы нашли решение проблемы, я бы хотел увидеть его.Надеюсь, он будет более элегантным, чем мой.

...