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相关插件:

1. fullcalendar

提供Calendar功能

2. formValidator

提供输入验证功能

3. Timepicker Addon for jQuery UI Datepicker

提供datepicker时间选择功能

开发代码:

导入相关jQuery插件类库,如下:

[html]  view plain copy print ?
  1. <script type="text/javascript" src="js/jquery-ui-1.8.6.custom.min.js"></script>  
  2.   
  3. <script type="text/javascript" src="js/jquery-ui-timepicker-addon.js"></script>  
  4.   
  5. <link rel="stylesheet" href="css/redmond/jquery-ui-1.8.1.custom.css">   
  6.   
  7. <!-- Jquery and Jquery UI -->  
  8.   
  9. <script src="js/formValidator/js/jquery.validationEngine.js" type="text/javascript"></script>  
  10.   
  11. <script src="js/formValidator/js/jquery.validationEngine-en.js" type="text/javascript"></script>  
  12.   
  13. <link rel="stylesheet" href="js/formValidator/css/validationEngine.jquery.css" type="text/css" media="screen" charset="utf-8" />  
  14.   
  15. <!-- FullCalender -->  
  16.   
  17. <link rel='stylesheet' type='text/css' href="js/fullcal/css/fullcalendar.css" />  
  18. <script type='text/javascript' src="js/fullcal/fullcalendar.js"></script>  


生成日历主界面:

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


 

以上代码将生成一些日历项目,显示在日历中。

[html]  view plain copy print ?
  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 plain copy print ?
  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('<a href=#>' + fstart + "-" +  fend + '<div style=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('<a href=#><div>Time: ' + fstart + "-" +  fend + '</div><div>Room:' + event.confname + '</div><div style=color:#E5E5E5>Host:' +  event.fullname + "</div></a>");  
  11.         var confbg='';  
  12.         if(event.confid==1){  
  13.           confbg = confbg + '<span class="fc-event-bg"></span>';  
  14.         }else if(event.confid==2){  
  15.           confbg = confbg + '<span class="fc-event-bg"></span>';  
  16.         }else if(event.confid==3){  
  17.           confbg = confbg + '<span class="fc-event-bg"></span>';  
  18.         }else if(event.confid==4){  
  19.           confbg = confbg + '<span class="fc-event-bg"></span>';  
  20.         }else if(event.confid==5){  
  21.           confbg = confbg + '<span class="fc-event-bg"></span>';  
  22.         }else if(event.confid==6){  
  23.           confbg = confbg + '<span class="fc-event-bg"></span>';  
  24.         }else{  
  25.           confbg = confbg + '<span class="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 + '<span class="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 + '<span class="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><div class="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 + '<span class="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><span class="ui-icon ui-icon-arrowthick-2-n-s"><div class="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 + '<span class="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><span class="ui-icon ui-icon-arrow-2-n-s"><div class="ui-resizable-handle ui-resizable-s"></div></span>';  
  55.           element.html(evtcontent);                 
  56.         }  
  57.         },   


以上定义了相关会议室预定系统日历项显示方式, 下面介绍会议室预定系统日历项拖动和调整大小,代码片段如下:

[html]  view plain copy print ?
  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.   
  39.       });  


以上代码如果需要详细说明,请大家参考官方文档,代码细节这里不再说明。 大家可以使用下面的演示代码运行一下。Fullcalendar是一个非常实用的日历插件,使用得当可以开发非常复杂的功能。例如,我们这里开发的会议室预定系统。强烈推荐!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值