JQuery DatePicker исключить даты - PullRequest
       6

JQuery DatePicker исключить даты

4 голосов
/ 20 февраля 2012

Я хочу сделать, это разные типы исключаемых дат из jQuery datepicker ui . Это ниже.

  • Одна дата: одна или несколько конкретных дат.
  • Периодический день: дни должны всегда отключаться из календаря, например; Воскресенье.
  • Периодическая дата: конкретная дата должна быть всегда отключена.
  • Период: отключение дат между двумя диапазонами дат.
  • Периодический период: отключение дат между двумя диапазонами дат.

Мои данные JSON

{ "не замужем": [ "2/4/2012", "3/2/2012" ], "recurrent_day": [ 0 ], "recurrent_date": [ 28 ], "период": [ { "от": "21.02.2012", "до": "22.02.2012" } ], "recurrent_period": [ { "от": "28.02.2012", "до": "29.02.2012", «период»: «ежемесячно» } ]}

Как я могу это сделать, Кто-нибудь, помогите мне.

Спасибо.

1 Ответ

4 голосов
/ 20 февраля 2012

С хитрым использованием обратного вызова beforeShowDay.Извините за задержку, у меня была ошибка в recurrent_period, которая заняла у меня некоторое время, чтобы определить.Я добавил «ежегодный» случай в набор тестов.Дайте мне знать, если я что-то осмотрел здесь.Веселый вопрос! jsFiddle

var invalid = { "single": [ "2/4/2012", "3/2/2012" ], "recurrent_day": [ 0 ], "recurrent_date": [ 28 ], "period": [ { "from": "2/21/2012", "to": "2/22/2012" } ], "recurrent_period": [ { "from": "2/28/2012", "to": "2/29/2012", "period": "monthly" },{ "from": "2/7/2012", "to": "2/9/2012", "period": "yearly" } ] };
function single(date){
    var USdate = (date.getMonth() + 1) + "/" + date.getDate() + "/" + date.getFullYear();
    return ($.inArray(USdate,invalid.single) > -1);
}
function recurrent_day(date){
    return ($.inArray(date.getDay(),invalid.recurrent_day) > -1);
}
function recurrent_date(date){
    return ($.inArray(date.getDate(),invalid.recurrent_date) > -1);
}
function period(date){
    var i, num, period, start, startArray, end, endArray;
    num = invalid.period.length;
    for(i=0;i<num;i++){
        period = invalid.period[i];
        startArray = period.from.split('/');
        start = new Date(startArray[2], (startArray[0] - 1), startArray[1]);
        endArray = period.to.split('/');
        end = new Date(endArray[2], (endArray[0] - 1), endArray[1]);        
        if(date>=start && date<=end){
            return true;
        }
    }
    return false;
}
function recurrent_period(date){
    var i, num, period, recurrence, startArray, endArray, startDay, endDay, start, end;
    num = invalid.recurrent_period.length;
    for(i=0;i<num;i++){
        period = invalid.recurrent_period[i];
        recurrence = period.period;
        startArray = period.from.split('/');
        endArray = period.to.split('/');

        if( recurrence === 'monthly' ){  
            startDay = parseInt( startArray[1], 10);
            endDay = parseInt( endArray[1], 10);
            if( date.getDate() >= startDay && date.getDate() <= endDay ){
                return true;             
            }               
        }else if( recurrence === 'yearly' ){
            start = new Date(date.getFullYear(), (startArray[0] - 1), startArray[1]);
            end = new Date(date.getFullYear(), (endArray[0] - 1), endArray[1]);  
            console.log({start:start.toDateString() ,end:end.toDateString(),day:date.toDateString()})   
            if(date>=start && date<=end){
                return true;
            }  
        }
    }
    return false;
}

$('input').datepicker({
    beforeShowDay: function(date){
        if(single(date)){
            return [false];
        }else if(recurrent_day(date)){
            return [false];
        }else if(recurrent_date(date)){
            return [false];
        }else if(period(date)){
            return [false];
        }else if(recurrent_period(date)){
            return [false];
        }
        return [true];
    }
});
...