徹底原生javascript簡約日曆插件,js、html

效果圖:

 

  效果如圖所示,儘管看上去並非很美觀,可是,基本上的功能仍是已經完成了,碼了一天多的時間,權當作複習一下js吧。javascript

  整個作下來差很少碼了500多行代碼~其實只是不少的樣式也包括了在其中了,雖然代碼有點多,可是不少地方仍是能夠優化的。html

  做爲新手,優化什麼的先滾一邊了,如今主要的是本身要懂對吧~若是感受能對你有所幫助,不嫌棄的話就看看吧。java

 

思路:

  ①找好一張樣式圖片;閉包

  

 

  ②分析樣式佈局……app

  ③涉及到的相關事件:click(單擊事件)、mouseover(鼠標覆蓋)、mouseout(鼠標離開)……編輯器

  ④閉包:做爲一個插件,須要避免和其餘插件產生衝突,如變量、方法啥啥啥的,因此就須要使用到閉包,就先階段我對閉包的理解,實際上是很簡單的,若是不清楚的話,看百度,上面有不少各類各樣的寫法……函數

  ⑤碼代碼……佈局

 

HTML

  很簡單,一個輸入框、入口js還有就是寫的js插件……學習

  

<!DOCTYPE html>
<html>
<head>
	<title>原生的日曆插件</title>
</head>
<body>
	<input type="text" name="time" id="container" class="calender-plugin">
	<script type="text/javascript" src="./calender.js"></script>    //須要注意引用順序
	<script type="text/javascript" src="./main.js"></script>  //這個就是所謂的「入口」函數,我取的名
</body>
</html>

  

main.js

  就是對js插件的調用,一句代碼……優化

window.onload = function(){
	CalenderPlugin('container',{
		width:298,
		height:192
	});
}

  

CalenderPlugin:插件的方法名稱
container:input輸入框的id
{
  width:298,
  height:192
}:自定義的相關參數(有好幾個,這裏我只定義了兩個,它可以覆蓋默認的相關參數)

 

calender.js插件

  由於所有都是採用js來完成的,代碼有點多,若是須要能夠直接複製粘貼到本身編輯器中。

;(function(window,document){
	var date = new Date();
	//默認參數
	var params = {
		width:300,
		height:400,
		borderRadius:3,
		backgroundColor:'#B4B4B2',
		weekendTitleBg:'#989896',//星期的背景顏色
		year:date.getFullYear(),
		month:date.getMonth()+1,
		day:date.getDate(),
		scope:'1946-2118',//年 查詢範圍
	}

	var CalenderPlugin = function(element_id,options){
		//判斷當前對象是否已經建立 instanceof:判斷對象類型
		//若是當前對象爲空,則不能調用其自身所定義的標準相關屬性
		if(!(this instanceof CalenderPlugin)) 
			return new CalenderPlugin(element_id,options);

		if (element_id==null || element_id==undefined || element_id=='') {
			console.error("You haven't binding Element to showing Calender !!!!!!");
			return;
		}
		this.params = this.extend(params,options);
		
		this.init(element_id,this.params)
	}

	//爲這個函數規定本身的標準
	CalenderPlugin.prototype = {
		//調用入口
		init:function(element_id,options){
			this.bind(element_id, options,this);
		},
		//擴展函數 用來規定用戶指定參數 - 默認參數之間的擴展
		//當用戶有規定相關的參數,則以用戶爲主,不然以默認參數爲主
		extend:function(opt1,opt2){
			if (opt2!=undefined || opt2!=null) {
				if(typeof(opt2)!="object") 
					return console.error("This "+typeof(opt2)+" is Belong object");
			}

			for(var i in opt2){
				for(var j in opt1){
					//相同屬性,則覆蓋
					if (i === j) {
						opt1[j] = opt2[i];
					}
					// 不一樣屬性,則添加
					else{
						opt1[i] = opt2[i];
					}
				}
			}
			return opt1;
		},
		//建立日曆樣式
		create:function(element_id,e,opt,cp){	
			//日曆容器
			var share = document.createElement('div');
			share.style.position = 'absolute';
			share.id = 'calender-container-share';
			share.style.width = '100vw';
			share.style.height = '100vh';
			share.style.top = 0;
			share.style.left = 0;
			share.style.zIndex = '998';
			var div = document.createElement('div');
			if (e.target.id === element_id) {
				div.className = 'calender-container-class-name'
				div.id = 'calender-container-id';
				div.style.position = 'absolute';
				div.style.width = opt.width +'px';
				div.style.height = opt.height +'px';
				//div.style.border = '1px solid ';
				div.style.top = e.clientY + 4 + 'px';
				div.style.left = e.clientX + 'px';
				div.style.zIndex = '999';
				div.style.display = 'block';
				div.style.borderRadius = opt.borderRadius + 'px';
				div.style.background = opt.backgroundColor;
				div.style.opacity = '0.8';
				share.appendChild(div);
				document.getElementsByTagName("body")[0].appendChild(share);
			}

			//生成日曆單元格
			//表單
			var form = document.createElement('form');
			form.style.width = 100+"%";
			form.style.height = 100+"%";

			//頭部的選擇項
			var header = document.createElement('div');
			header.style.width = 100+"%";
			header.style.height = opt.height/8+"px";
			header.style.lineHeight = '1.5'
			// 年選擇
			var year_select_container = document.createElement('div');
			year_select_container.style.display = 'inline-block';
			year_select_container.style.height = '100%';
			year_select_container.style.width = '40%';

			//左箭頭
			var year_left_btn = document.createElement('div');
			year_left_btn.id = 'calender-year-left-btn';
			year_left_btn.style.width = '8px';
			year_left_btn.style.height = '8px';
			year_left_btn.style.display = 'inline-block';
			year_left_btn.style.border = '2px solid white';
			year_left_btn.style.borderTop = 'none';
			year_left_btn.style.borderRight = 'none';
			year_left_btn.style.transform = 'rotate(45deg)';
			year_left_btn.style.position = 'relative';
			year_left_btn.style.cursor = 'pointer';
			year_left_btn.style.marginLeft = '10%';
			year_select_container.appendChild(year_left_btn);
			//年
			var year_label = document.createElement('div');
			year_label.id = 'calender-year-label';
			year_label.innerText = opt.year+'年';
			year_label.style.color = 'white';
			year_label.style.display = 'inline-block';
			year_label.style.padding = '0 7%';
			year_label.style.cursor = 'pointer';

			year_select_container.appendChild(year_label);
			//右箭頭
			var year_right_btn = document.createElement('div');
			year_right_btn.id = 'calender-year-right-btn';
			year_right_btn.style.width = '8px';
			year_right_btn.style.height = '8px';
			year_right_btn.style.display = 'inline-block';
			year_right_btn.style.border = '2px solid white';
			year_right_btn.style.borderTop = 'none';
			year_right_btn.style.borderRight = 'none';
			year_right_btn.style.transform = 'rotate(-135deg)';
			year_right_btn.style.cursor = 'pointer';
			year_select_container.appendChild(year_right_btn);
			header.appendChild(year_select_container);
			

			//月
			var month_select_container = document.createElement('div');
			month_select_container.style.display = 'inline-block';
			month_select_container.style.height = '100%';
			month_select_container.style.width = '28%';
			month_select_container.style.float = 'right';
			//左箭頭
			var month_left_btn = document.createElement('div');
			month_left_btn.id = 'calender-month-left-btn-id';
			month_left_btn.style.width = '8px';
			month_left_btn.style.height = '8px';
			month_left_btn.style.display = 'inline-block';
			month_left_btn.style.border = '2px solid white';
			month_left_btn.style.borderTop = 'none';
			month_left_btn.style.borderRight = 'none';
			month_left_btn.style.transform = 'rotate(45deg)';
			month_left_btn.style.position = 'relative';
			month_left_btn.style.marginLeft = '10%';
			month_left_btn.style.cursor = 'pointer';
			month_select_container.appendChild(month_left_btn);
			//月標籤
			var month_label = document.createElement('div');
			month_label.innerText = opt.month+'月';
			month_label.id = 'calender-month-label-id';
			month_label.style.color = 'white';
			month_label.style.display = 'inline-block';
			month_label.style.padding = '0 7%';
			month_label.style.cursor = 'pointer';
			month_select_container.appendChild(month_label);
			//右箭頭
			var month_right_btn = document.createElement('div');
			month_right_btn.id = 'calender-month-right-btn-id';
			month_right_btn.style.width = '8px';
			month_right_btn.style.height = '8px';
			month_right_btn.style.display = 'inline-block';
			month_right_btn.style.border = '2px solid white';
			month_right_btn.style.borderTop = 'none';
			month_right_btn.style.borderRight = 'none';
			month_right_btn.style.transform = 'rotate(-135deg)';
			month_right_btn.style.cursor = 'pointer';
			month_select_container.appendChild(month_right_btn);

			header.appendChild(month_select_container);
			form.appendChild(header);

			//星期標題
			var weekendTitle = document.createElement('div');
			weekendTitle.style.width = 100+"%";
			weekendTitle.style.height = opt.height/9+"px";
			weekendTitle.style.background = opt.weekendTitleBg;
			var weekends = ['日','一','二','三','四','五','六'];
			var w_table = document.createElement('table');
			w_table.style.width = 100+"%";
			w_table.style.height = 100+"%";
			w_table.style.color = "white";
			w_table.style.textAlign = 'center';
			w_table.style.fontSize = '7px';
			var w_row = document.createElement('tr');
			for(var i in weekends){
				var w_column = document.createElement('td');
				w_column.innerText = weekends[i];
				w_row.appendChild(w_column);
			}
			w_table.appendChild(w_row);
			weekendTitle.appendChild(w_table);
			form.appendChild(weekendTitle);

			//日期表格
			var table = document.createElement('table');
			table.style.width = 100+"%";
			table.id = 'calender-days-table';
			table.style.height = opt.height 
				- (header.style.height.substring(0, header.style.height.indexOf('p'))) 
				- (weekendTitle.style.height.substring(0, weekendTitle.style.height.indexOf('p')))
				+"px";
			table.style.textAlign = 'center';
			table.style.fontSize = '7px';
			table.style.color = 'white';
			form.appendChild(table);
			div.appendChild(form);

			this.bind(element_id, opt,cp);
		},
		//事件綁定
		//change()和getDate()原本也屬於事件綁定
		//可是因爲,有些方法須要進行重複的調用,因此避免引發事件的循環調用,因此分開寫
		bind:function(element_id,opt,cp){
			document.addEventListener("click", function(e){
				//判斷是否已經存在日曆容器,則先清除,再建立  排除自身
				if (document.getElementsByClassName('calender-container-class-name').length >0
						&& e.target.id === 'calender-container-share') {
					var el = document.getElementById('calender-container-share');
					document.getElementById('calender-container-share')
							.parentNode.removeChild(el);
				}
				if(document.getElementsByClassName('calender-container-class-name').length >0){
					return;
				}
				if(e.target.id !== element_id){
					return;
				}
				cp.create(element_id,e,opt,cp);
				cp.build(element_id,opt,cp);
				cp.change(element_id,opt,cp);
				}, false);
		},
		// 當年、月發生改變時觸發
		change:function(element_id,opt,cp){

			// 減小一個月
			if(document.getElementById('calender-month-left-btn-id') != null)
				document.getElementById('calender-month-left-btn-id')
					.addEventListener('click', function(e){
						if(opt.month>1 && opt.month <=12)
							opt.month = opt.month - 1;
						cp.build(element_id,opt,cp);
					}, false);

			// 加一個月
			if(document.getElementById('calender-month-right-btn-id') != null)
				document.getElementById('calender-month-right-btn-id')
					.addEventListener('click', function(e){
						if(opt.month>=1 && opt.month <12)
							opt.month = opt.month + 1;
						cp.build(element_id,opt,cp);
					}, false);

			// 減一年
			if(document.getElementById('calender-year-left-btn') != null)
				document.getElementById('calender-year-left-btn')
					.addEventListener('click', function(e){
						opt.year = opt.year - 1;
						cp.build(element_id,opt,cp);
					}, false);

			// 加一年
			if(document.getElementById('calender-year-right-btn') != null)
				document.getElementById('calender-year-right-btn')
					.addEventListener('click', function(e){
						opt.year = opt.year + 1;
						cp.build(element_id,opt,cp);
					}, false);

			//選擇年
			if(document.getElementById('calender-year-label') != null)
				document.getElementById('calender-year-label')
					.addEventListener('click', function(e){
						var year_list = document.createElement('div');
						year_list.id = 'year-list-id';
						year_list.style.width = opt.width/5 +'px';
						year_list.style.height = opt.height/2 +'px';
						year_list.style.zIndex = '999';
						year_list.style.position = 'fixed';
						year_list.style.top = e.y + 'px';
						year_list.style.left = e.x + 'px';
						year_list.style.background = 'white';
						year_list.style.border = '1px solid white';
						year_list.style.opacity = '0.8';
						year_list.style.overflow = 'scroll';
						year_list.style.overflowX = 'hidden';
						
						var ul = document.createElement('ul');
						ul.style.listStyleType = 'none';
						ul.style.padding = '0';
						var years = opt.scope.split('-');
						for(var i=years[0];i<=years[1];i++){
							var li = document.createElement('li');
							li.innerText = i;
							li.style.fontSize = '7px';
							li.style.color = '#ff4747';
							li.style.cursor = 'pointer';
							ul.appendChild(li);
						}
						year_list.appendChild(ul);
						if(document.getElementById('year-list-id')==null){
							document.getElementById('calender-container-id').appendChild(year_list);
						};
						cp.getDate(element_id,opt);
					}, false);
		},
		// 獲取時間
		getDate:function(element_id,opt){
			_this = this;
			//選擇日期是的點擊事件、hover
			if(document.getElementById('calender-days-table') != null){
				var trs = document.getElementById('calender-days-table').childNodes;
				for(var i=0;i< trs.length;i++){
					var tds = trs[i].childNodes;
					for(var j=0;j<tds.length;j++){
						trs[i].childNodes[j].addEventListener('click', function(e){
							document.getElementById(element_id).value = e.target.className;
							var el = document.getElementById('calender-container-share');
							document.getElementById('calender-container-share')
							.parentNode.removeChild(el);
						}, false);

						trs[i].childNodes[j].addEventListener('mouseover', function(e){
							e.target.style.border = '1px solid white';
							e.target.style.opacity = '0.5';
						}, false);

						trs[i].childNodes[j].addEventListener('mouseout', function(e){
							e.target.style.border = 'none';
							e.target.style.opacity = '';
						}, false);
					}
				}
			}

			//下拉選擇年份
			if(document.getElementById('year-list-id') !=null){
				var lis = document.getElementById('year-list-id').childNodes[0].childNodes;
				lis.forEach(function(item,index){
					item.addEventListener('click', function(e){
						opt.year = new Number(e.target.innerText);
						_this.build(element_id,opt,_this);
						document.getElementById('year-list-id').parentNode.removeChild(document.getElementById('year-list-id'));
					}, false);

					item.addEventListener('mouseover', function(e){
						e.target.style.background = 'rgb(195, 195, 193)';
						e.target.style.color = 'white';
					}, false);

					item.addEventListener('mouseout', function(e){
						e.target.style.background = '';
						e.target.style.color = '#ff4747';
					}, false);
				})
			}
		},
		//構建數據表格
		build:function(element_id,opt,cp){
			//年份顯示
			document.getElementById('calender-year-label').innerText = opt.year +'年';
			// 月份顯示
			document.getElementById('calender-month-label-id').innerText = opt.month +'月';
			// 日期表格
			var table = document.getElementById('calender-days-table');
			if (table!=null) {
				var trs = table.childNodes;
				while(trs.length>0){
					table.removeChild(trs[0]);
				}
				
				var year,
						month,
						day,
						days,
						last_month_days,//上個月天數
						next_month_days;//下個月天數
					year = opt.year;
					month = opt.month;
					day = opt.day;

					//生成一個時間對象
					//爲了獲取到每一年每個月其中的一號是星期幾
					var date = new Date(year,month-1,1);
					//日期行、列
					switch(month){
						case 1:
							days = 31;
							last_month_days = 31;
							if (year%4 == 0 && year%100 != 0){
								next_month_days = 29;
							}
							else{
								next_month_days = 28;
							}
						break;
						case 2:
							last_month_days = 31;
							next_month_days = 30;
							if (year%4 == 0 && year%100 != 0){
								days = 29;
							}
							else{
								days = 28;
							}
						break;
						case 3:
							if (year%4 == 0 && year%100 != 0){
								last_month_days = 29;
							}
							else{
								last_month_days = 28;
							}
							days = 31;
							next_month_days = 30;
						break;
						case 4:
							days = 30;
							last_month_days = 31;
							next_month_days = 31;
						break;
						case 5:
							days = 31;
							last_month_days = 30;
							next_month_days = 30;
						break;
						case 6:
							days = 30;
							last_month_days = 31;
							next_month_days = 31;
						break;
						case 7:
							days = 31;
							last_month_days = 30;
							next_month_days = 31;
						break;
						case 8:
							days = 31;
							last_month_days = 31;
							next_month_days = 30;
						break;
						case 9:
							days = 30;
							last_month_days = 31;
							next_month_days = 31;
						break;
						case 10:
							days = 31;
							last_month_days = 30;
							next_month_days = 30;
						break;
						case 11:
							days = 30;
							last_month_days = 31;
							next_month_days = 31;
						break;
						case 12:
							days = 31;
							last_month_days = 31;
							next_month_days = 31;
						break;
						default:
							return console.log("the month have "+ month+" ???");
					}
					var o = 1;
					var l = last_month_days - date.getDay() + 1;//上個月開始時間
					var n = 1;//下個月開始時間
					for(var i=0;i<Math.ceil((days+date.getDay()+1)/7);i++){//計算表格多少行
						var row = document.createElement('tr');
						for(var j=0;j<7;j++){
							var column = document.createElement('td');
							column.style.cursor = 'pointer';
							if (i==0 && o<= days) {//處理「每月1號」這個特殊日期
								if(j>=date.getDay()){
									column.innerText = o;
									column.className = year+"-"+month+"-"+o;
									o++;
								}
								else{//上個月時間
									column.innerText = l;
									column.className = year+"-"+(month-1)+"-"+l;
									l ++;
								}
							}
							else{
								if (o<=days) {
									column.innerText = o;
									column.className = year+"-"+month+"-"+o;
									o ++;
								}
								else{//下一個月
									column.innerText = n;
									column.className = year+"-"+(month+1)+"-"+n;
									n ++;
								}
							}
							if (j==6 || j==0) {
								column.style.color = '#ffb714';
							}
							row.appendChild(column);
						}
						table.appendChild(row);
					}
			}
			this.getDate(element_id,opt);
		}
	};

	window.CalenderPlugin = CalenderPlugin;
}(window,document));

  

  ~這個東西不清楚怎麼摺疊代碼塊,將就的看看吧~

  

 

 

好的,完啦~

只有不斷學習纔會進步,工資纔會高,老闆才能看你順眼,你才能選擇公司,選擇老闆!

相關文章
相關標籤/搜索