先說一下個人另外一博客地址: https://home.cnblogs.com/u/bllx/javascript
前段時間,一直在開發考勤系統,當時爲知足設計的需求,選了好幾個插件,最後決定採用Fullcanlendar的插件。感受這個插件能夠知足現階段的功能開發需求;由於設計圖是日曆塊的展現以及天天的日曆還有功能需求點,所以,想到了能夠實現備忘錄的功能的FullCalendar插件。
css
爲了實現設計圖,插件自身的樣式仍是有些醜的,所以,不少樣式細節須要修改,插件的使用難點在於實現數據的渲染。html
<link rel="stylesheet" type="text/css" href="css/fullcalendar.min.css"/> <link rel="stylesheet" type="text/css" href="css/fullcalendar.print.css"/> <script type="text/javascript" src="js/moment.min.js" ></script> <script type="text/javascript" src="js/jquery.min.js" ></script> <script type="text/javascript" src="js/jquery-ui.min.js" ></script> <script type="text/javascript" src="js/fullcalendar.min.js" ></script>
<div class="canlendar" id="canlendar"></div><!--頁面結構-->
$('#calendar').fullCalendar({ /*設置日曆頭部信息,若是設置爲false,則不顯示頭部信息。 * 包括left,center,right左中右三個位置均可以對應一下配置 * title:顯示當前月份/周、日信息 * prev:用於切換到上一月/周/日視圖的按鈕 * next:用於切換到下一月/周/日視圖的按鈕 * prevYear:用於切換到上一年視圖的按鈕 * nextYear:用於切換到下一年視圖的按鈕 * */ header:{ left: '', center: 'Fullcanlendar示例demo', right: 'today prev,next' }, theme:false,//若是設置爲true,則須要加載jquery ui相關css和js文件,默認值爲false firstDay:1,//設置一週中顯示的第一天是哪天,週日是0,週一是1,類推 isRTL:false,//設置爲ture時則日曆從右往左顯示 weekends:true,//是否顯示週末,設爲false則不顯示週六和週日。默認值爲true hiddenDays:[],//隱藏一週中的某一天或某幾天,數組形式,如隱藏週二和週五:[2,5],默認不隱藏,除非weekends設置爲false。 weekMode:'fixed',//在月視圖裏顯示周的模式,由於每個月週數可能不一樣,因此月視圖高度不必定。fixed:固定顯示6周高,日曆高度保持不變liquid:不固定週數,高度隨週數變化variable:不固定週數,但高度固定 weekNumbers:false,//是否在日曆中顯示周次(一年中的第幾周),若是設置爲true,則會在月視圖的左側、周視圖和日視圖的左上角顯示週數。 weekNumberCalculation:'iso',//周次的顯示格式。 //height:600,//設置日曆的高度,包括header日曆頭部,默認未設置,高度根據aspectRatio值自適應。 //contentHeight://設置日曆主體內容的高度,不包括header部分,默認未設置,高度根據aspectRatio值自適應。 aspectRatio:1.35,//設置日曆單元格寬度與高度的比例。 handleWindowResize:true,//是否隨瀏覽器窗口大小變化而自動變化。 render:function(view){ console.log('render',view) },//method,綁定日曆到id上。$('#id').fullCalendar('render'); destroy:function(){ }, weekNumbers : false, //是否在視圖左邊顯示這是第多少周,默認false eventLimit: true, //數據條數太多時,限制各自裏顯示的數據條數(多餘的以「+2more」格式顯示),默認false不限制,支持輸入數字設定固定的顯示條數 viewRender : function(view,element){//在視圖被渲染時觸發(切換視圖也觸發) 參數view爲視圖對象,參數element爲Jquery的視圖Dom }, dayRender : function(date, cell){//日期格式Render鉤子函數(我沒理解清楚) console.log("↓↓↓dayRender↓↓↓"); console.log(date); console.log(cell); }, windowResize : function(){//瀏覽器窗體變化時觸發 console.log("---windowResize---"); }, allDayText : "全天", //自定義全天視圖的名稱 slotDuration : "01:00:00", //一格時間槽表明多長時間,默認00:30:00(30分鐘) slotLabelFormat : "H(:mm)a", //日期視圖左邊那一列顯示的每一格日期時間格式 slotLabelInterval : "02:00:00", //日期視圖左邊那一列多長間隔顯示一條日期文字(默認跟着slotDuration走的,可自定義) snapDuration : "05:00:00", //其實就是動態建立一個日程時,默認建立多長的時間塊 slotEventOverlap : false, //相同時間段的多個日程視覺上是否容許重疊,默認true容許 noEventsMessage : "L沒數據啊", //listview視圖下,無數據時顯示提示 defaultDate : '2018-09-10', //默認顯示那一天的日期視圖getDates(true) nowIndicator : true, //周/日視圖中顯示今天當前時間點(以紅線標記),默認false不顯示 monthNames : ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], //月份自定義命名 monthNamesShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], //月份縮略命名(英語比較實用:全稱January可設置縮略爲Jan) dayNames: ["週日", "週一", "週二", "週三", "週四", "週五", "週六"], //同理monthNames dayNamesShort: ["週日", "週一", "週二", "週三", "週四", "週五", "週六"], //同理monthNamesShort weekNumberTitle : "周", //周的國際化,默認爲"W" eventLimitText : "更多", //當一塊區域內容太多以"+2 more"格式顯示時,這個more的名稱自定義(應該與eventLimit: true一併用) dayPopoverFormat : "YYYY年M月d日", //點開"+2 more"彈出的小窗口標題,與eventLimitClick能夠結合用 navLinks : true, // 「xx周」是否能夠被點擊,默認false,若是爲true則周視圖「周幾」被點擊以後進入日視圖。本地測試:沒什麼效果 dayClick: function(date, jsEvent, view) {//空白的日期區,單擊時觸發 console.log("↓↓↓dayClick↓↓↓"); console.log('Clicked on: ' + date.format()); console.log('Coordinates: ' + jsEvent.pageX + ',' + jsEvent.pageY); console.log('Current view: ' + view.name); //$(this).css('background-color', 'red'); }, eventClick: function(calEvent, jsEvent, view) {//日程區塊,單擊時觸發 console.log(jsEvent.target) alert(jsEvent.target.innerHTML) console.log("↓↓↓eventClick↓↓↓"); console.log('Event: ' + calEvent.title); console.log('Coordinates: ' + jsEvent.pageX + ',' + jsEvent.pageY); console.log('Current view: ' + view.name); return false; //return false能夠阻止點擊後續事件發生(好比event中的url跳轉事件) }, eventMouseover: function(calEvent, jsEvent, view){//鼠標在日程區塊上時觸發 console.log(jsEvent) console.log(calEvent.start._i) $('.hover-dateStr').html(calEvent.start._i) console.log(jsEvent.pageY,jsEvent.pageX) $('.hover-container').removeClass('none').animate({'top':jsEvent.pageY,'left':jsEvent.pageX}) if(!canRun){ // 判斷是否已空閒,若是在執行中,則直接return return; } }, eventMouseout: function(calEvent, jsEvent, view){//鼠標從日程區塊離開時觸發 $('.hover-container').addClass('none') }, selectable: false, //容許用戶能夠長按鼠標選擇多個區域(好比月視圖,能夠選中多天;日視圖能夠選中多個小時),默認false不能選擇多區域的 selectHelper: true, //接selectable,周/日視圖在選擇時是否預先畫出「日程區塊」的樣式出來 unselectAuto : true, //是否點擊頁面上的其餘地方會致使當前的選擇被清除,默認true unselectCancel : "", //一種方法來指定元素,會忽略unselectauto選項,默認'' selectOverlap : true, //肯定用戶是否被容許選擇被事件佔用的時間段,默認true可佔用時間段 selectAllow : function(selectInfo){ //精確的編程控制用戶能夠選擇的地方,返回true則表示可選擇,false表示不可選擇 console.log("↓↓↓selectConstraint↓↓↓"); console.log("start:"+selectInfo.start+"|end:"+selectInfo.end+"|resourceId:"+selectInfo.resourceId); return true; }, select: function(start, end,jsEvent,view) { //點擊空白區域/選擇區域內容觸發 }, unselect : function(view, jsEvent){//選擇操做取消時觸發 console.log("↓↓↓unselect↓↓↓"); console.log("view:"+view); }, lazyFetching : true, //是否啓用懶加載技術--即只取當前條件下的視圖數據,其它數據在切換時觸發,默認true只取當前視圖的,false是取全視圖的 defaultTimedEventDuration : "02:00:00", //在Event Object中若是沒有end參數時使用,如start=7:00pm,則該日程對象時間範圍就是7:00~9:00 defaultAllDayEventDuration : { days: 1 }, //默認1天是多長,(有的是採用工做時間模式,因此支持自定義) loading : function(isLoading, view){ //視圖數據加載中、加載完成觸發 console.log("↓↓↓loading↓↓↓"); if(isLoading == true){ console.log("view:"+view+",開始加載"); }else if(isLoading == false){ console.log("view:"+view+",加載完成"); }else{ console.log("view:"+view+",除非天塌下來不然不會進這個分支"); } }, eventOrder : "title", //多個相同的日程數據排序方式,String / Array / Function, 默認值: "title" eventRender : function(event, element, view) { //當Event對象開始渲染時觸發 console.log("eventRender():"+event.title); }, eventAfterAllRender : function(view){console.log("eventAfterAllRender();");}, //當全部Event對象渲染完成時觸發 editable: true, //支持Event日程拖動修改,默認false eventStartEditable : true, //Event日程開始時間能夠改變,默認true,若是是false其實就是指日程塊不能隨意拖動,只能上下拉伸改變他的endTime eventDurationEditable : false, //Event日程的開始結束時間距離是否能夠改變,默認true,若是是false則表示開始結束時間範圍不能拉伸,只能拖拽 dragOpacity:0.2, //拖拽時不透明度,0.0~1.0之間,數字越小越透明 dragScroll : true, //是否在拖拽時自動移動容器,默認true eventOverlap : true, //拖拽時是否重疊 eventConstraint : { //限制拖拽拖放的位置(即限制有些地方拖不進去):an event ID, "businessHours", object start: '10:00', // a start time (10am in this example) end: '18:00', // an end time (6pm in this example) dow: [ 1, 2, 3, 4 ] // days of week. an array of zero-based day of week integers (0=Sunday) (Monday-Thursday in this example) }, longPressDelay : 1000, //面向可touch設備(如移動設備),長按多少毫秒便可拖動,默認1000毫秒(1S) eventDragStart : function(event, jsEvent, ui, view){ //日程開始拖拽時觸發 console.log("eventDragStart():"+event.title); }, eventDragStop : function(event, jsEvent, ui, view){ //日程拖拽中止時觸發 console.log("eventDragStop():"+event.title); }, eventDrop : function(event, delta, revertFunc, jsEvent, ui, view){ //日程拖拽中止而且已經拖拽到其它位置了 console.log("eventDrop():"+event.title); }, eventResizeStart : function( event, jsEvent, ui, view ) { //日程大小調整開始時觸發 console.log("eventResizeStart():"+event.title); }, eventResizeStop : function(event, jsEvent, ui, view){ //日程大小調整中止時觸發 console.log("eventResizeStop():"+event.title); }, eventResize : function(event, delta, revertFunc, jsEvent, ui, view){ //日程大小調整完成並已經執行更新時觸發 console.log("eventResize():"+event.title); }, events:[ { "time": "9:20--18:20", "antualTime":"9:40--18:40", "start": "2018-09-01" }, { "time": "9:40--18:40", "antualTime":"9:40--18:40", "start": "2018-09-02" } ] });
若是將數據源向上述代碼中放置的話,是直接一次渲染全部數據,在切換不一樣月份的時候,將不會再次渲染,這就會在頁面一開始加載時請求服務器,渲染全部數據,源碼中在切換先後相鄰月份的時候,也是從新渲染了數據,咱們想要的是在切換月份的時候,再去請求服務器獲取該月份的數據java
//初始化日程表 events:function(start, end, timezone,callback){ var date = this.getDate().format('YYYY-MM'); var arr=date.split("-"); var events = loopMonthDay(arr[0],arr[1]);// loopMonthDay(arr[0],arr[1]);是本身封裝的函數 callback(events);//回調中執行渲染 }