1. 程式人生 > >日曆任務外掛(jquery版)

日曆任務外掛(jquery版)

先放張圖和原始碼 jquery版 : https://gitee.com/under_the_sky/dateTask/tree/master/jquery%E7%89%88

下載地址 :https://gitee.com/under_the_sky/dateTask.git

 

使用方法:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<script src="js/jquery-1.10.2.min.js"></script>
		<link rel="stylesheet" href="js/layui/css/layui.css"  media="all">
		<link rel="stylesheet" type="text/css" href="css/kgodate.css"/>
		<script src="js/KGODateTask.js"></script>
	</head>
	<body>	
		<div class="content-date"></div>

		<script>
		  KGODate.init($('.content-date'),2018,11);
		  KGODate.addTask('2018-11-06');
		</script>
	</body>
</html>

1)引用jquery.js , KGODateTask.js 和 kgodate.css ;其中 KGODateTask.js 使用閉包封裝日曆元件,kgodate.css 是對日曆樣式宣告

2) 為日曆宣告容器 

3) 初始化日曆 

// 指定日期 的日曆 初始化
KGODate.init($('.content-date'),2018,11);

//預設當前月的日曆 初始化 
KGODate.init($('.content-date'));

4)addTask新增任務功能還未完善,後面會更新。入參會定義為json物件,日曆按照月份展示,因此只會支援到當前月新增任務

 

原始碼  jquery版 下載地址 : https://gitee.com/under_the_sky/dateTask.git

 

附上js部分程式碼(最新版可以到碼雲裡下載)

/**
* 為了不讓該物件的錯誤影響系統,這裡進行一下閉包操作
*/
var KGODate = (function(){
	/**
	 * 內部方法,獲取當前月共有多少天
	 * 列印上個月的最後幾天時需要知道上個月共有幾天
	 * 
	 */
	function getMonthTotalDays(year , month){
		//當前月的開始日期
		var startDate = new Date(year,month-1,1);
		//當前月的結束日期
		var endDate = new Date(year,month,0); 
		//當前月共多少天
		var gapDay = Math.abs(endDate - startDate) / (1000*60*60*24) + 1 ;
		return gapDay;
	}
	/**
	 * 定義一個內部方法獲取當月的日期資料,
	 */
	function getMonthDays(year,month){
			//gapDay 標示這個月和上個月中間相差多少天,意思就是當月共有多少天 
			var today , thisMonth ,thisYear ,thisfirstDay ,thisLastDay , gapDay;
			var dateArray = [];
			//如果沒有傳年或者月,就認為是當前月 
			if(!year||!month){
				today = new Date;
				thisMonth = today.getMonth()+1;
				thisYear = today.getFullYear();
				var startDate = new Date(thisYear,thisMonth-1,1);
				var endDate = new Date(thisYear,thisMonth,0);
				thisfirstDay =  startDate.getDay();
				thisLastDay =  endDate.getDay();
				//一星期有7天,外國星期天是第一天,所以星期天是 0 這些做一下轉化
				//if(thisLastDay==0) thisLastDay = 7;
				thisLastDay = thisLastDay==0 ? 7 : thisLastDay ;
				gapDay = Math.abs(endDate - startDate) / (1000*60*60*24) + 1 ;
			}else{
				//獲取當前月,js的月份是從0-11的,所以傳入資料需要 -1 
				today = new Date(year,month-1);
				//年資料,月資料有可能發生越界,比如 11月31號 是12月1號 ,這裡需要重新獲取一些當前月和當前年
				thisMonth = today.getMonth()+1;
				thisYear = today.getFullYear();
				var startDate = new Date(thisYear,thisMonth-1,1);
				var endDate = new Date(thisYear,thisMonth,0);
				//這裡的firstDay 是本月的第一天是周幾
				thisfirstDay =  startDate.getDay();
				//LastDay 同上 
				thisLastDay =  endDate.getDay();
				//一星期有7天,外國星期天是第一天,所以星期天是 0 這些做一下轉化
				//if(thisLastDay==0) thisLastDay = 7;
				thisLastDay = thisLastDay==0 ? 7 : thisLastDay ;
				//日期相減返回的是毫秒,並且會少一天 
				gapDay = Math.abs(endDate - startDate) / (1000*60*60*24) + 1 ;
			
			}
			//當前資料表格需要輸出多少天 ,sum = 當月天數 + 上個月最後幾天 + 下個月的開始幾天 
			//arraySize 一定是7的整數倍 ,但是有可能是4*7 ,有可能是5*7 也有可能是 6*7 
			//這裡計算 陣列長度是為了返回最小的 陣列長度 不嚴謹的做法可以統一用 6*7
			var arraySize =  parseInt(gapDay) + parseInt(thisfirstDay) +(7-thisLastDay-1);
			//上一個月的最後一天
			var lastMonthLastDay =getMonthTotalDays(thisYear,thisMonth-1);
		
			//下面開始迴圈將日曆的資料放陣列中
			for(var i=0; i < arraySize;i++){
				// 星期幾 ? i是從零開始的,所以這裡要 +1
				var _weeknum = (i+1)%7;
				//如果是周天,對7取餘數會等 0 ,這裡三目運算修改一下
				_weeknum = _weeknum==0 ? 7 : _weeknum ;
				// 列印上個月的最後幾天,這裡本月的第一天是從1開始計算的(周天被轉化為了7)所以要列印到前一天
				if(i<thisfirstDay-1){
					dateArray.push({
						week:_weeknum,
						type:'lastMonth',
						days:lastMonthLastDay-(thisfirstDay-1)+i+1,
					});
				//列印當月時間
				}else if(Math.abs(i+1-thisfirstDay+1) <= gapDay){
					dateArray.push({
						week:_weeknum,
						type:'thisMonth',
						days:Math.abs(i+1-thisfirstDay+1),
					});
				//列印下個月資料
				}else{
					dateArray.push({
						week:_weeknum,
						type:'nextMonth',
						days:Math.abs(i+1-thisfirstDay - gapDay)+1,
					});
				}
				
			}
			//返回物件,當前年,當前月,當前月天資料
			return {
				year:thisYear,
				month:thisMonth,
				days:dateArray
			};
		} 
		/**
		 * 新增內部方法列印日曆頭部資訊
		 * 
		 */
		function printHeadDom($dom,days){
			var _kgo_date_dom =	'<div id="kgo-date-content">'
							+'	<div class="kgo-date-task-title">'
							+ days.year +'-' + days.month
							+'  </div>'
							+'	<table class="kgo-date-task" cellspacing="0">'
							+'			<colgroup>'
							+'				<col>'
							+'				<col>'
							+'				<col>'
							+'				<col>'
							+'				<col>'
							+'				<col style="background-color: rgb(51,255,202,0.3);">'
							+'				<col style="background-color: rgb(51,255,202,0.3);">'
							+'			</colgroup>'
							+'		<thead>'
							+'		<tr>'
							+'			<th>星期一</th>'
							+'			<th>星期二</th>'
							+'			<th>星期三</th>'
							+'			<th>星期四</th>'
							+'			<th>星期五</th>'
							+'			<th>星期六</th>'
							+'			<th>星期天</th>'
							+'		</tr> '
							+'		</thead>'
							+'		<tbody class="date-day-table">'
							+'	</table>'
							+'</div>	 '
			$dom.append(_kgo_date_dom);
		};
		/**
		 * 定義內部方法列印 日期資訊
		 */
		function printDateBody($dom,days){
			var dom ="";
			$.each(days.days,function(index,item){
				var td_date_sty = 'this-month-day-sty'
				if(item.type=='lastMonth'||item.type=='nextMonth'){
					var td_date_sty = 'not-this-month-day-sty'
				}
				if((index+1)%7==1){
					dom += '<tr>';
				} 
				var  theday ="";
				if(item.type=='thisMonth'){
					
					if(item.days<10){
						theday=days.year+"-"+days.month+"-0"+item.days;
					}else{
						theday=days.year+"-"+days.month+"-"+item.days;
					}
					
				}
			   
				dom  += '<td class="'+td_date_sty+'" theday="'+theday+'">'
				     + '<span class="kgo-date-day">'+item.days+'</span></td>';
				if((index+1)%7==0){
					dom+='</tr>';
				} 
			})
			$('.date-day-table').append(dom);
			
			$('.kgo-date-task  td').on('click',function(){
				alert($(this).text());
			});
			
		};
		function printDateTask(day){
			var dom ='<div class="kgo-date-task-body">'
					+'<span class="kgo-undone-badge kgo-badge-total">未完成(1)</span><br>'
					+'<span class="kgo-done-badge kgo-badge-total">已完成(5)</span><br>'
					+'<span class="kgo-overdue-badge kgo-badge-total">已超時(3)</span>'
					+'<span class="kgo-overdue-badge kgo-badge-total">已超時(3)</span>'
					+'</div>';		
			$('.kgo-date-task  td[theday='+day+']').append(dom);

		};
		
		
		/**
		 * 暴露的屬性和方法
		 */
		return {
			init : function($dom,year,month){
				var days = getMonthDays(year,month);
				printHeadDom($dom,days);
				printDateBody($dom,days);
			},
			addTask(day){
				printDateTask(day);
			}
			
			
		}
				
	
	
	
	
		
		
})();