2012-02-20 85 views
4

我想從jQuery datepicker ui做排除日期的不同類型。那些在下面。jQuery datepicker排除日期

  • 單日期:一個或多個特定日期。
  • 經常性日子:日曆應該從日曆中停用,例如:星期日。
  • 經常性日期:應該始終禁用特定日期。
  • 期間:禁用兩個日期範圍之間的日期。
  • 經常性週期:反覆禁用兩個日期範圍之間的日期。

我的JSON DATA

{ 「單」:[ 「2012年2月4日」, 「2012/3/2」 ], 「recurrent_day」:[], 「recurrent_date」:[], 「期間」:[{ 「從」: 「2012年2月21日」, 「到」: 「2/22/2012」 } ], 「recurrent_period」:[{ 「從」: 「2012/2/28」, 「到」: 「2012/2/29」, 「期間」: 「每月」 } ]}

我該怎麼做,有人幫助我。

謝謝。

+0

如果jQuery提供一個乾淨的方式來做到這一點,那麼它是好的,否則我會建議任何其他日期選擇器,甚至定製。 – Shaheer 2012-02-20 08:28:01

+0

潛在的「時期」是什麼?你已經使用「每月」,但這只是一個嚴重的日期,應該給予「recurrent_date」。你想每年?是否有另一個「每月」的理由? – Sinetheta 2012-02-20 08:38:30

+0

@Sinetheta:是的你的正確。每年還有另一種選擇。 – Gowri 2012-02-20 08:45:46

回答

4

隨便用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]; 
    } 
}); 
+0

看起來像你解決了我的問題,你能否澄清如何在fly.i上做到這一點。框中,ajax調用將返回json.here,我需要重新配置日曆。 – Gowri 2012-02-20 09:10:52

+0

ajax何時發生?如果你使用ajax來更新這個'invalid'這樣的全局變量,那麼你可以隨時更新它。上面的代碼將在每次datepicker出現時運行,因此使用'beforeShowDay'。每次他們嘗試選擇日期時,都會檢查「invalid」數組的當前狀態。請記住,這不是非常防禦性的編碼,我需要知道數據來自哪裏,以及可能/不可能存在的內容(例如:是否所有範圍總是存在,有時只是空的?)。 – Sinetheta 2012-02-20 09:21:25

+0

是的,我明白,單個和其他函數將如何獲得無效變量的值。它存儲在ajax成功。或者我可以在成功函數中使用函數。有些時間範圍將會全部或全部爲空。感謝您的幫助。 – Gowri 2012-02-20 09:39:54