首页 > 编程 > JavaScript > 正文

利用JS实现简单的日期选择插件

2019-11-19 17:48:19
字体:
来源:转载
供稿:网友

首先是调用方法如下

//调用方法,后面回调函数返回的是当前选择的日期 calender('#calend').init(function(date){  this.innerHTML = date });
//具体参数说明 //如果需要传入参数,第一个为json,第二个为回调函数 //下面是format格式化显示格式类型,有如下几种: //yyyy为年数  //大写M为月数  //d为几号  //h为小时  //小写m为分钟  //s为秒数  //q为季度  //小写e,为数字星期格式  //大写E,为中文星期格式  //举例:'yyyy年MM月dd日','yyyy-MM-dd','yyyy','MM','e','dd E' //注意:以上获取时间如果是个位数则返回个位数,比如7月,则返回7,如果需要返回07,参数可以写成这样“MM”,其它同理,由于时分秒功能还没有添加,默认获取当前时分秒  calender('#calend').init({  date : [2015,12,12], //设置默认显示年月日,默认当前年月日   format : 'yyyy-MM-dd', //设置显示格式  button : false //是否显示按钮  left : 0, //追加left,默认0 top :0, //追加top,默认0 onload : function(){ } //初始化完成执行,this为当前创建的日历对象 },function(date){  //回调函数  this.innerHTML = date });

主要css样式

.containter {	width:320px;	margin:auto}.calender-wrap {	-webkit-animation:clafade .3s ease;	-moz-animation:clafade .3s ease;	animation:clafade .3s ease;	padding:5px;	background:#fff;	width:240px;	box-shadow:0 5px 10px rgba(0,0,0,0.2);	border-radius:4px;	position:relative;	font-family:"Microsoft yahei";	position:absolute;	z-index:1000}.calender-wrap {	border:1px solid #e2e2e2}.calender-wrap:after {	content:'';	display:inline-block;	border-left:7px solid transparent;	border-right:7px solid transparent;	border-bottom:7px solid #eee;	border-top:0;	border-bottom-color:#d7d7d7;	position:absolute;	left:9px;	top:-7px}.calender-wrap:before {	content:'';	display:inline-block;	border-left:6px solid transparent;	border-right:6px solid transparent;	border-bottom:6px solid #ffffff;	border-top:0;	position:absolute;	left:10px;	top:-6px;	z-index:10}.calender-caption {	height:35px;	border-bottom:1px solid #ddd;	z-index:2;	background:#eee}.calender-content {	position:relative;	overflow:hidden}.calender-content:after {	content:'';	display:block;	clear:both}.calender-cell {	cursor:pointer;	float:left;	width:14.28571428%;	height:35px;	text-align:center;	line-height:35px;	font-size:12px;	color:#000;	z-index:1;	border-bottom:1px solid #eee}.calender-cell:hover {	background:#eee}.calender-caption .calender-cell:hover {	background:none}.calender-cell-dark {	cursor:no-drop;	color:#b9b9b9}.calender-caption .calender-cell {	height:35px;	line-height:35px;	font-size:13px;	color:#111;	font-weight:bold}.calender-header {	text-align:center;	line-height:35px;	text-align:center;	color:#888;	padding-bottom:4px;	margin-bottom:1px;	background:#fff;	position:relative;	border-bottom:1px solid #e6e6e6;	font-size:14px}#calender-prev,#calender-next {	text-decoration:none;	display:block;	width:14.2857%;	height:35px;	background:#fff;	position:absolute;	left:0%;	top:0px;	font-family:'宋体';	font-size:14px;	color:#555}#calender-prev,#calender-next {	color:#999;	font-size:16px}#calender-prev:hover,#calender-next:hover {	background:#eee;	border-radius:5px;	color:#222}#calender-next {	left:auto;	right:0%}#calender-year,#calender-mon {	cursor:pointer;	padding:2px 4px;	border-radius: 3px;	margin:0 3px;}#calender-year:hover,#calender-mon:hover {	background:#eee}.calender-list {	overflow:hidden}.calender-list2,.calender-list3 {	display:none}.calender-year-cell,.calender-mon-cell {	width:32.41%;	float:left;	border-radius:4px;	text-align:center;	font-size:12px;	padding:15px 0;	border:1px solid #fff}.calender-year-cell:hover,.calender-mon-cell:hover {	background:#eee;	cursor:pointer}.calender-cell.active,.calender-year-cell.active,.calender-mon-cell.active {	background:#23acf1;	color:#fff}.calender-cell.active:hover,.calender-year-cell.active:hover,.calender-mon-cell.active:hover {	background:#23acf1;	color:#fff}.calender-button {	border-top:1px solid #eee;	width:100%;	margin-top:-1px;	padding:7px 0px 2px 0;	overflow:hidden}.calender-button a {	display:block;	text-align:center;	padding:0px 15px;	height: 25px;	line-height: 25px;	float:right;	background:#23acf1;	color:#fff;	margin-right:5px;	cursor:pointer;	margin-left:5px;	font-size:12px;	text-decoration:none}.calender-button a:hover {	background:#0084c9}.calender-wrap.year .calender-list,.calender-wrap.month .calender-list {	display:none}.calender-wrap.year .calender-list2 {	display:block}.calender-wrap.month .calender-list3 {	display:block}@keyframes clafade {	0% {	transform:scale(0.95);	opacity:0}100% {	transform:scale(1);	opacity:1}}@-webkit-keyframes clafade {	0% {	-webkit-transform:scale(0.95);	opacity:0}100% {	-webkit-transform:scale(1);	opacity:1}}	.calend {	display: block;	width: 180px;	line-height: 28px;	background: #222;	color: #fff;	padding: 5px 12px;	margin:20px 20px 20px 0;	font-size: 14px;}

效果图一(默认参数)


效果图二(显示按钮,设置时间)

完整实例

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>无标题文档</title><style>.containter {	width:320px;	margin:auto}.calender-wrap {	-webkit-animation:clafade .3s ease;	-moz-animation:clafade .3s ease;	animation:clafade .3s ease;	padding:5px;	background:#fff;	width:240px;	box-shadow:0 5px 10px rgba(0,0,0,0.2);	border-radius:4px;	position:relative;	font-family:"Microsoft yahei";	position:absolute;	z-index:1000}.calender-wrap {	border:1px solid #e2e2e2}.calender-wrap:after {	content:'';	display:inline-block;	border-left:7px solid transparent;	border-right:7px solid transparent;	border-bottom:7px solid #eee;	border-top:0;	border-bottom-color:#d7d7d7;	position:absolute;	left:9px;	top:-7px}.calender-wrap:before {	content:'';	display:inline-block;	border-left:6px solid transparent;	border-right:6px solid transparent;	border-bottom:6px solid #ffffff;	border-top:0;	position:absolute;	left:10px;	top:-6px;	z-index:10}.calender-caption {	height:35px;	border-bottom:1px solid #ddd;	z-index:2;	background:#eee}.calender-content {	position:relative;	overflow:hidden}.calender-content:after {	content:'';	display:block;	clear:both}.calender-cell {	cursor:pointer;	float:left;	width:14.28571428%;	height:35px;	text-align:center;	line-height:35px;	font-size:12px;	color:#000;	z-index:1;	border-bottom:1px solid #eee}.calender-cell:hover {	background:#eee}.calender-caption .calender-cell:hover {	background:none}.calender-cell-dark {	cursor:no-drop;	color:#b9b9b9}.calender-caption .calender-cell {	height:35px;	line-height:35px;	font-size:13px;	color:#111;	font-weight:bold}.calender-header {	text-align:center;	line-height:35px;	text-align:center;	color:#888;	padding-bottom:4px;	margin-bottom:1px;	background:#fff;	position:relative;	border-bottom:1px solid #e6e6e6;	font-size:14px}#calender-prev,#calender-next {	text-decoration:none;	display:block;	width:14.2857%;	height:35px;	background:#fff;	position:absolute;	left:0%;	top:0px;	font-family:'宋体';	font-size:14px;	color:#555}#calender-prev,#calender-next {	color:#999;	font-size:16px}#calender-prev:hover,#calender-next:hover {	background:#eee;	border-radius:5px;	color:#222}#calender-next {	left:auto;	right:0%}#calender-year,#calender-mon {	cursor:pointer;	padding:2px 4px;	border-radius: 3px;	margin:0 3px;}#calender-year:hover,#calender-mon:hover {	background:#eee}.calender-list {	overflow:hidden}.calender-list2,.calender-list3 {	display:none}.calender-year-cell,.calender-mon-cell {	width:32.41%;	float:left;	border-radius:4px;	text-align:center;	font-size:12px;	padding:15px 0;	border:1px solid #fff}.calender-year-cell:hover,.calender-mon-cell:hover {	background:#eee;	cursor:pointer}.calender-cell.active,.calender-year-cell.active,.calender-mon-cell.active {	background:#23acf1;	color:#fff}.calender-cell.active:hover,.calender-year-cell.active:hover,.calender-mon-cell.active:hover {	background:#23acf1;	color:#fff}.calender-button {	border-top:1px solid #eee;	width:100%;	margin-top:-1px;	padding:7px 0px 2px 0;	overflow:hidden}.calender-button a {	display:block;	text-align:center;	padding:0px 15px;	height: 25px;	line-height: 25px;	float:right;	background:#23acf1;	color:#fff;	margin-right:5px;	cursor:pointer;	margin-left:5px;	font-size:12px;	text-decoration:none}.calender-button a:hover {	background:#0084c9}.calender-wrap.year .calender-list,.calender-wrap.month .calender-list {	display:none}.calender-wrap.year .calender-list2 {	display:block}.calender-wrap.month .calender-list3 {	display:block}@keyframes clafade {	0% {	transform:scale(0.95);	opacity:0}100% {	transform:scale(1);	opacity:1}}@-webkit-keyframes clafade {	0% {	-webkit-transform:scale(0.95);	opacity:0}100% {	-webkit-transform:scale(1);	opacity:1}}	.calend {	display: block;	width: 180px;	line-height: 28px;	background: #222;	color: #fff;	padding: 5px 12px;	margin:20px 20px 20px 0;	font-size: 14px;}</style></head><body><div id="calend" class="calend">选择日期</div><div id="calend1" class="calend">选择日期</div><script>window.calender = (function(win,doc){	function C(str){		this.dom = doc.querySelector(str);		this.s = {			date : [ new Date().getFullYear(),new Date().getMonth()+1,new Date().getDate()],			button : false,			format : 'yyyy年MM月dd日',			left : 0,			top: 0,			onload : function(){}		}	};	C.prototype = {		init : function(){			var t = this;			if( typeof arguments[0] == 'function'){	 		t.cb = arguments[0];	 	}else{	 		t.newS = arguments[0];	 		t.cb = arguments[1] || function(){}	 	};	 	t.yoff = false;	 	t.moff = false;			t.extend(t.s,t.newS);			t.nt = new Date();			t.nt.setFullYear(t.s.date[0]);		 	t.nt.setMonth(t.s.date[1]-1);		 	var len = this.getDateLength(t.nt.getFullYear(),t.nt.getMonth() )		 	t.nt.setDate(t.s.date[2]>len ? len : t.s.date[2]);		 	t.day = t.nt.getDate();			t.dom.onclick = function(ev){				var e = ev || event;				t.create();				t.bind();				t.s.onload.call(this)				e.stopPropagation ? e.stopPropagation() : (e.cancelBubble = true)			};			},		hide : function(){			var t = this;			t.cb.call(t.dom,t.format( t.nt.getFullYear()+'/'+ (t.nt.getMonth()+1)+'/'+ t.day+' '+new Date().getHours()+':'+new Date().getMinutes()+':'+new Date().getSeconds(),t.s.format));			if( g('.calender-wrap')) doc.body.removeChild( g('.calender-wrap') )		},		bind : function(){			var t = this;			var Content = g('.calender-content');			t.createDay();			var Prev = g('#calender-prev'),				Next = g('#calender-next'),				Year = g('#calender-year'),				Mon = g('#calender-mon');			if(t.s.button){				var today = g('.calender-today');				var enter = g('.calender-ent');				today.onclick = function(){					t.nt.setFullYear(new Date().getFullYear());				 	t.nt.setMonth(new Date().getMonth());				 	t.nt.setDate( new Date().getDate());				 	t.s.date[2] = t.day = new Date().getDate()					t.createYear()					t.createDay()					t.createMon()				};				enter.onclick = function(){					t.hide();				}			}			Content.onclick = function(ev){				var ev = ev || event; 		 	var _target = ev.target || ev.srcElement; 		 	if(!t.has(_target,'calender-cell-dark') ){		 		var chl = this.children;		 		for(var i = 0;i<chl.length;i++){		 			t.del(chl[i],'active');		 		};		 		t.add(_target,'active');		 		t.nt.setDate(_target.getAttribute('data-n'));		 		t.s.date[2] = t.day = _target.getAttribute('data-n')		 		if(!t.s.button){		 			t.hide();		 		}		 	}			}			Prev.onclick = Next.onclick = function(){				var y = t.nt.getFullYear(),m = t.nt.getMonth();				if(t.moff) return				if(t.yoff){					t.nt.setFullYear( this.id=="calender-prev" ? y -= 9 : y += 9)					t.createYear()				}else{					this.id=="calender-prev" ? m-- : m++;					t.nt.setDate(1);					t.nt.setMonth( m );					t.createDay()				}			}			Year.onclick = function(){				t.createYear();				t.yoff = true;				t.moff = false;				t.del(g('.calender-wrap'),'month');				t.add(g('.calender-wrap'),'year');			};			Mon.onclick = function(){				t.createMon();				t.moff = true;				t.yoff = false;				t.del(g('.calender-wrap'),'year');				t.add(g('.calender-wrap'),'month');			};		},		getDateLength : function(year,month){			//获取某一月有多少天, month为实际月份,一月即为1			return new Date(year,month,0).getDate();		},		getFirstDay : function(year,month){			//获取某一月第一天是周几,month为实际月份,一月即为1,返回0即为周日			return new Date(year,month-1,0).getDay();		},		createMon : function(){			var t= this,html='';			var m = t.nt.getMonth()+1;			m = m == 0 ? 12 : m;			for(var i = 1;i<=12;i++){				html+='<div class="calender-mon-cell '+( m == i ? 'active' : '') +' ">'+ (i) +'</div>';			};			g('.calender-list3').innerHTML = html;			var cells = doc.querySelectorAll('.calender-mon-cell');			for(var i2 = 0;i2<cells.length;i2++){			 	cells[i2].onclick = function(){			 		t.moff = false			 		t.del(g('.calender-wrap'),'month');			 		t.nt.setDate(1)					t.nt.setMonth(+this.innerHTML-1);					t.createDay();			 	}			}		},		createYear : function(){			var t= this,html='',y = (t.nt.getFullYear());			var Year = g('#calender-year');			for(var i = 0;i<9;i++){				html+='<div class="calender-year-cell '+( (y-(4-i)) == y ? 'active' :'') +' ">'+ (y-(4-i)) +'</div>';			}			Year.innerHTML = y			g('.calender-list2').innerHTML = html;			var cells = doc.querySelectorAll('.calender-year-cell');			for(var i2 = 0;i2<cells.length;i2++){			 	cells[i2].onclick = function(){			 		t.yoff = false;			 		t.del(g('.calender-wrap'),'year');					t.nt.setFullYear(+this.innerHTML);					t.createDay();			 	}			}		},		createDay : function(n){			var t = this, 				y = t.nt.getFullYear(),				m = (t.nt.getMonth())+1;			g('#calender-year').innerHTML = m===0 ? y-1 : y;			g('#calender-mon').innerHTML = m === 0 ? 12 : two(m);			// if(t.nt.getMonth()+1 == t.s.date[1] && t.nt.getFullYear()==t.s.date[0] ){			// 	t.nt.setDate(t.s.date[2]);			// };			var firstDay = this.getFirstDay(y,m),				length = this.getDateLength(y,m),				lastMonthLength = this.getDateLength(y,m-1),				i,html = '';				t.day = t.s.date[2] > length ? length : t.s.date[2];			//循环输出月前空格			if(firstDay ===0) firstDay = 7;			for(i=1;i<firstDay+1;i++){				html += '<div class="calender-cell calender-cell-dark">' + (lastMonthLength - firstDay + i) + '</div>';			}			//循环输出当前月所有天			for(i=1;i<length+1;i++){				html += '<div data-n='+i+' class="calender-cell '+ (i == t.day ? 'active' :'') +'">' + i + '</div>';			}			//if(8-(length+firstDay)%7 !=8){			for(i=1;i<= (41-(length+(firstDay==0 ? 7 : firstDay)-1));i++){				html+= '<div class="calender-cell calender-cell-dark">' + i + '</div>';			};			doc.querySelector('.calender-content').innerHTML = html		},		create : function(){			var t= this;			if( g('.calender-wrap')) doc.body.removeChild( g('.calender-wrap') )			var private_Day_title=['一','二','三','四','五','六','日'];			//内容			var html = '<div class="calender-wrap">';			html +='<div id="calender-header" class="calender-header none-btn "><a id="calender-prev" href="javascript:;"><</a><a id="calender-next" href="javascript:;">></a> <span id="calender-year">2016</span>年<span id="calender-mon">10</span>月</div>'			//星期			html += '<div class="calender-list"><div class="calender-caption">';			for(i=0;i<7;i++){				html += '<div class="calender-cell">' + private_Day_title[i] + '</div>';			};			html += '</div><div class="calender-content"></div>';			if(this.s.button){				html+='<div class="calender-button"><a href="javascript:;" class="calender-ent">确定</a><a href="javascript:;" class="calender-today">今天</a></div>';			};			html += '</div><div class="calender-list calender-list2"></div><div class="calender-list calender-list3"></div>'			doc.body.insertAdjacentHTML("beforeend", html);			var wrap = g('.calender-wrap');			function setPosi(){				var _top = doc.documentElement.scrollTop || doc.body.scrollTop;				wrap.style.left = t.dom.getBoundingClientRect().left +t.s.left +'px';;				wrap.style.top = t.dom.getBoundingClientRect().top + _top + t.dom.offsetHeight+t.s.top + 15 +'px';			};			setPosi();			addEvent(window,'resize',function(){setPosi()})			wrap.onclick = function(ev){				var e = ev || event;				e.stopPropagation ? e.stopPropagation() : (e.cancelBubble = true)			}		},	 format : function(da,format){	  	var _newDate = new Date(da);	 		var WeekArr=['星期日','星期一','星期二','星期三','星期四','星期五','星期六']; 		 var o = { 		  'M+' : _newDate.getMonth()+1, //month 		  'd+' : _newDate.getDate(), //day 		  'h+' : _newDate.getHours(), //hour 		  'm+' : _newDate.getMinutes(), //minute 		  's+' : _newDate.getSeconds(), //second 		  'q+' : Math.floor((_newDate.getMonth()+3)/3), //quarter 		  'S': _newDate.getMilliseconds(), //millisecond 		  'E': WeekArr[_newDate.getDay()], 		  'e+' : _newDate.getDay() 		 }; 		 if (/(y+)/.test(format)){		 	format = format.replace(RegExp.$1, (_newDate.getFullYear()+"").substr(4 - RegExp.$1.length));		 };		 for(var k in o) { 		  if(new RegExp('('+ k +')').test(format)) { 		   format = format.replace(RegExp.$1, RegExp.$1.length==1 ? o[k] : ('00'+ o[k]).substr((''+ o[k]).length)); 		  }; 		 }; 		 return format; 	 },	 extend : function(n,n1){	  for(var i in n1){n[i] = n1[i]};	 },		has : function(o,n){		 return new RegExp('//b'+n+'//b').test(o.className); 	 },		add : function(o,n){		 if(!this.has(o, n)) o.className+=' '+n; 	 },		del : function(o,n){		 if(this.has(o, n)){ 		  o.className = o.className.replace(new RegExp('(?:^|//s)'+n+'(?=//s|$)'), '').replace(/^/s*|/s*$/g, ''); 		 }; 	 }	};	function g(str){return doc.querySelector(str)};	function addEvent(obj,name,fn){obj.addEventListener? obj.addEventListener(name, fn, false):obj.attachEvent('on'+name,fn);}; function two(num){return num<10 ? ('0'+num) : (''+num)};	addEvent(doc,'click',function(){		if( g('.calender-wrap')) doc.body.removeChild( g('.calender-wrap') )	});	function c(o){return new C(o)};return c;})(window,document);;(function(){  calender('#calend').init(function(date){ 		this.innerHTML = date	});	calender('#calend1').init({format : 'yyyy-MM-dd',    date : [2020,5,12],		button : true	},function(date){		this.innerHTML = date	});})();</script></body></html>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表