1. 程式人生 > >jQuery外掛實戰之fullcalendar(日曆外掛)Demo

jQuery外掛實戰之fullcalendar(日曆外掛)Demo

jQuery的外掛非常多,應用的場景也非常豐富,今天我這裡給大家介紹一款非常實用的日曆頁面開發外掛 - fullcalendar,目前最新版本是1.5.1,使用這款外掛能夠快速幫助你快速程式設計實現基於web的日曆檢視功能,大家可能都使用過outlook的日曆項功能,使用日曆介面能更方便的檢視待辦事項或者約會。開發過程快速方便。外掛首頁的文件也非常全。當然目前只有英文文件。不錯外掛支援多語言,這個很不錯。

在過去web程式開發中,我曾經使用這個外掛開發了公司內部的會議室預定系統,這裡我簡單的介紹一下fullcalendar的相關開發,並且例項講解一下如何使用這個外掛開發日曆,其中會使用到fullcalendar

裡相關的高階功能,例如,拖拽修改時間,生成個性化的會議室預定系統日曆項內容。以上程式碼都是實際專案中使用的前臺,大家如果需要可以直接修改使用。

專案需求:

1. 需要在fullcalendar的原有介面上美化,這裡我們使用jQueryUI來實現介面美化,因為fullcalendar可以很好的和jQueryUI無縫整合

2. 生成單獨的日曆項新增和檢視功能,這裡仍舊使用jQueryUI的dialog來實現

3. 因為是一個實際專案,需要資料驗證,所以這裡我們使用formVaildator外掛實現

4. 新增一個 "轉到某日"功能, 這個介面功能在Fullcalendar裡沒有,我們可以通過程式設計新增類似一個功能,其中呼叫了datepicker的一個addon,後面會介紹到

5. 周和日瀏覽可以自由的支援拖拽和移動,用來修改日期和時間

6. 瀏覽器支援: IE8和Firefox

jQuery相關外掛:

提供Calendar功能

提供輸入驗證功能

提供datepicker時間選擇功能

開發程式碼:

匯入相關jQuery外掛類庫,如下:

[html] view plaincopyprint?
  1. <scripttype="text/javascript"src="js/jquery-ui-1.8.6.custom.min.js"></script>
  2. <scripttype="text/javascript"src="js/jquery-ui-timepicker-addon.js"
    ></script>
  3. <linkrel="stylesheet"href="css/redmond/jquery-ui-1.8.1.custom.css">
  4. <!-- Jquery and Jquery UI -->
  5. <scriptsrc="js/formValidator/js/jquery.validationEngine.js"type="text/javascript"></script>
  6. <scriptsrc="js/formValidator/js/jquery.validationEngine-en.js"type="text/javascript"></script>
  7. <linkrel="stylesheet"href="js/formValidator/css/validationEngine.jquery.css"type="text/css"media="screen"charset="utf-8"/>
  8. <!-- FullCalender -->
  9. <linkrel='stylesheet'type='text/css'href="js/fullcal/css/fullcalendar.css"/>
  10. <scripttype='text/javascript'src="js/fullcal/fullcalendar.js"></script>


生成日曆主介面:

[html] view plaincopyprint?
  1. $('#calendar').fullCalendar({  
  2.          header:{  
  3.            right: 'prev,next today',  
  4.            center: 'title',  
  5.            left: 'month,agendaWeek,agendaDay'  
  6.          },  
  7.          theme: true,  
  8.          editable: true,  
  9.          allDaySlot : false,  
  10.          events:  function(start, end , callback){  
  11.          var events = [];  
  12.  ...            
  13.          callback(events);  
  14.          },  
  15.  ...  


以上程式碼將在id=calendar的div裡生成一個日曆,其中theme定義使用jQueryUI來生成介面,events主要定義生成的會議室預定系統日曆專案,這裡我們使用如下程式碼生成日曆項,在實際開發過程中,我們可以在這裡呼叫後臺程式,或者使用其它方法生成資料,這裡為了簡單演示,我們使用js來生成需要的日曆專案,程式碼如下:

[html] view plaincopyprint?
  1. var now = new Date();  
  2.         for(var i=-10;i<60;i++){  
  3.           var evtstart = new Date(now.getFullYear() , now.getMonth() , (now.getDate()-i), now.getHours()-5, now.getMinutes(), now.getSeconds(), now.getMilliseconds());  
  4.           var evtend = new Date(now.getFullYear() , now.getMonth() , (now.getDate()-i), now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());               
  5.           events.push({  
  6.             sid: 1,  
  7.             uid: 1,  
  8.             title: 'Daily Scrum meeting',  
  9.             start: evtstart,  
  10.             end: evtend,  
  11.             fullname: 'terry li',  
  12.             confname: 'Meeting 1',  
  13.             confshortname: 'M1',  
  14.             confcolor: '#ff3f3f',  
  15.             confid: 'test1',  
  16.             allDay: false,  
  17.             topic: 'Daily Scrum meeting',  
  18.             description : 'Daily Scrum meeting',  
  19.             id: 1,  
  20.           });         
  21.         }          

以上程式碼將生成一些日曆專案,顯示在日曆中。

[html] view plaincopyprint?
  1. $('#calendar').fullCalendar({    
  2.  ...  
  3.  ...   
  4.  dayClick: function(date, allDay, jsEvent, view) { // 定義了點選日曆中日期格子的動作,這裡將會呼叫jQueryUi的dialog生成建立新日曆項的對話方塊  
  5.  ...  
  6. },  
  7. eventClick: function(event) {  // 定義了點選日曆項的動作,這裡將會呼叫jQueryUi的dialog顯示日曆項的內容  
  8. },  
  9.  ...   


接下來是fullcalendar的幾個方法,用來設定會議室預定系統日曆項的顯示,分別是eventRender, eventAfterRender,這裡幾個方法可以用來生成日曆項的內容,具體如下:

[html] view plaincopyprint?
  1. eventRender: function(event, element) {  
  2.           var fstart  = $.fullCalendar.formatDate(event.start, "HH:mm");  
  3.         var fend  = $.fullCalendar.formatDate(event.end, "HH:mm");    
  4.         // Bug in IE8  
  5.         //element.html('<ahref=#>' + fstart + "-" +  fend + '<divstyle=color:#E5E5E5>' +  event.title + "</div></a>");  
  6.         },  
  7.         eventAfterRender : function(event, element, view) {  
  8.           var fstart  = $.fullCalendar.formatDate(event.start, "HH:mm");  
  9.         var fend  = $.fullCalendar.formatDate(event.end, "HH:mm");      
  10.         //element.html('<ahref=#><div>Time: ' + fstart + "-" +  fend + '</div><div>Room:' + event.confname + '</div><divstyle=color:#E5E5E5>Host:' +  event.fullname + "</div></a>");  
  11.         var confbg='';  
  12.         if(event.confid==1){  
  13.           confbg = confbg + '<spanclass="fc-event-bg"></span>';  
  14.         }else if(event.confid==2){  
  15.           confbg = confbg + '<spanclass="fc-event-bg"></span>';  
  16.         }else if(event.confid==3){  
  17.           confbg = confbg + '<spanclass="fc-event-bg"></span>';  
  18.         }else if(event.confid==4){  
  19.           confbg = confbg + '<spanclass="fc-event-bg"></span>';  
  20.         }else if(event.confid==5){  
  21.           confbg = confbg + '<spanclass="fc-event-bg"></span>';  
  22.         }else if(event.confid==6){  
  23.           confbg = confbg + '<spanclass="fc-event-bg"></span>';  
  24.         }else{  
  25.           confbg = confbg + '<spanclass="fc-event-bg"></span>';  
  26.         }  
  27.         var titlebg =  '<span class="fc-event-conf" style="background:'+  event.confcolor +'">' + event.confshortname + '</span>';  
  28.         if(event.repweeks>0){  
  29.           titlebg = titlebg + '<spanclass="fc-event-conf"style="background:#fff;top:0;right:15;color:#3974BC;font-weight:bold">R</span>';  
  30.         }  
  31.         if(view.name=="month"){  
  32.           var evtcontent = '<div class="fc-event-vert"><a>';  
  33.           evtcontent = evtcontent + confbg;  
  34.           evtcontent = evtcontent + '<spanclass="fc-event-titlebg">' +  fstart + " - " +  fend + titlebg + '</span>';  
  35.           evtcontent = evtcontent + '<span>Room: ' +  event.confname + '</span>';  
  36.           evtcontent = evtcontent + '<span>Host: ' +  event.fullname + '</span>';  
  37.           evtcontent = evtcontent + '</a><divclass="ui-resizable-handle ui-resizable-e"></div></div>';  
  38.           element.html(evtcontent);  
  39.         }else if(view.name=="agendaWeek"){  
  40.           var evtcontent = '<a>';  
  41.           evtcontent = evtcontent + confbg;  
  42.           evtcontent = evtcontent + '<spanclass="fc-event-time">' +  fstart + "-" +  fend + titlebg + '</span>';  
  43.           evtcontent = evtcontent + '<span>' +  event.confname + ' by ' + event.fullname + '</span>';  
  44.           //evtcontent = evtcontent + '<span>' +  event.fullname + '</span>';  
  45.           evtcontent = evtcontent + '</a><spanclass="ui-icon ui-icon-arrowthick-2-n-s"><divclass="ui-resizable-handle ui-resizable-s"></div></span>';  
  46.           element.html(evtcontent);             
  47.         }else if(view.name=="agendaDay"){  
  48.           var evtcontent = '<a>';  
  49.           evtcontent = evtcontent + confbg;  
  50.           evtcontent = evtcontent + '<spanclass="fc-event-time">' +  fstart + " - " +  fend + titlebg + '</span>';  
  51.           evtcontent = evtcontent + '<span>Room: ' +  event.confname + '</span>';  
  52.           evtcontent = evtcontent + '<span>Host: ' +  event.fullname + '</span>';  
  53.           evtcontent = evtcontent + '<span>Topic: ' +  event.topic + '</span>';  
  54.           evtcontent = evtcontent + '</a><spanclass="ui-icon ui-icon-arrow-2-n-s"><divclass="ui-resizable-handle ui-resizable-s"></div></span>';  
  55.           element.html(evtcontent);                 
  56.         }  
  57.         },   


以上定義了相關會議室預定系統日曆項顯示方式, 下面介紹會議室預定系統日曆項拖動和調整大小,程式碼片段如下:

[html] view plaincopyprint?
  1. eventDragStart: function( event, jsEvent, ui, view ) {  
  2.         ui.helper.draggable("option", "revert", true);  
  3.         },  
  4.         eventDragStop: function( event, jsEvent, ui, view ) {  
  5.         },  
  6.         eventDrop: function( event, dayDelta, minuteDelta, allDay, revertFunc, jsEvent, ui, view ) {   
  7.         if(1==1||2==event.uid){  
  8.           var schdata = {startdate:event.start, enddate:event.end, confid:event.confid, sid:event.sid};  
  9.           identityService.getToBeUpdatedConflictedScheduleDAO(schdata , {  
  10.             callback:function(data) {   
  11.               if(data.length== 0){                  
  12.                 var newschdata = {sid:event.sid, startdate:event.start, enddate:event.end};               
  13.                 identityService.updateScheduleByNewDateRange(newschdata, {  
  14.                   callback:function(data) {     
  15.                     alert("Thanks, reservation rescheduled successfully.");  
  16.                     //window.location.reload();  
  17.                   }                           
  18.                 });                         
  19.               }else{  
  20.                 revertFunc();  
  21.                 alert("Sorry, reservation cannot be rescheduled.");  
  22.               }               
  23.             }  
  24.           });  
  25.         }else{  
  26.           revertFunc();  
  27.         }  
  28.         },  
  29.         eventResizeStart:  function( event, jsEvent, ui, view ) {  
  30.         },  
  31.         eventResize: function(event,dayDelta,minuteDelta,revertFunc) {  
  32.         if(1==1||2==event.uid){  
  33.           var schdata = {startdate:event.start, enddate:event.end, confid:event.confid, sid:event.sid};  
  34.         }else{  
  35.           revertFunc();  
  36.         }  
  37.         }  
  38.       });  


以上程式碼如果需要詳細說明,請大家參考官方文件,程式碼細節這裡不再說明。 大家可以使用下面的演示程式碼執行一下。Fullcalendar是一個非常實用的日曆外掛,使用得當可以開發非常複雜的功能。例如,我們這裡開發的會議室預定系統。強烈推薦!