天天看點

fullcalender的基本使用

一、使用方式

1、依賴的檔案引入

2、頁面使用–具體的各項屬性和方法可以參照中文手冊https://blog.csdn.net/ymnets/article/details/78661247

複制代碼

Fullcanlendar代碼示例

<div class="canlendar" id="calendar"></div>    

    <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>
    <script>
        
                $('#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"
                                    }
                                ]
                    });
                
        
        
        
    </script>
</body>
           

複制代碼 三、擷取資料:

整個的插件使用的難點就在于擷取資料,如果依賴events函數直接獲得資料源的話,将背景傳過來的當月資料整理好放入回調函數中,也是可行的,但是在擷取上一個月或者下一個月的時候資料不會再次擷取資料;

使用eventSources也是同樣的道理,具體可以檢視部落格https://www.helloweba.net/javascript/454.html;

使用ajax請求,向背景請求該月份的資料的話,最好的方式就是在切換月份的時候,請求接口,擷取資料;而不是一次擷取大量的資料渲染,這樣會導緻渲染速度太慢,網頁響應速度慢,影響使用者的體驗。

按 Ctrl+C 複制代碼

//初始化日程表

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);//将整理好格式的數組放在回調中執行,這樣在切換月份的時候就會自動掉接口擷取

          }

按 Ctrl+C 複制代碼

四、說明

因為預設的Fullcanlendar的樣式比較簡單直接,是以一般情況下是需要改寫樣式的。