每天学一个jquery插件-做日期插件2

每天学一个jquery插件-做日期插件2

做日期插件2

就着昨天的逻辑来的,写起来倒是压力不大,关键是没想好咋将这个玩意和输入框绑起来,先按固定流程记下笔记

效果如下
在这里插入图片描述

代码部分

*{
    
    
	margin: 0px;
	padding: 0px;
	user-select: none;
}
.rel{
    
    
	width: 210px;
	height: 240px;
	position: relative;
}
.item{
    
    
	font-size: 12px;
	width: 30px;
	height: 30px;
	display: flex;
	justify-content: center;
	align-items: center;
	float:left;
	color: black;
	cursor: pointer;
}
.item:hover{
    
    
	opacity: 0.9;
	background-color: gray;
	color: white;
}
.item.head{
    
    
	background-color: gray;
	color: white;
}
.item.prev,.item.next{
    
    
	color: lightgray;
}
.item.check{
    
    
	background-color: #2ecc71!important;
	color: white!important;
}
.item.tool{
    
    
	font-weight: bold;
	position: absolute;
	bottom: 0;
}
.left{
    
    
	left: 30px;
}
.val{
    
    
	left: 60px;
}
.right{
    
    
	left: 150px;
}
.rright{
    
    
	left: 180px;
}
.val{
    
    
	width: 90px;
	pointer-events: none;
}
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>做日期插件</title>
		<script src="js/jquery-3.4.1.min.js"></script>
		<script src="js/zrqcj.js"></script>
		<link href="css/zrqcj.css" type="text/css" rel="stylesheet" />
		<style>
			#div{
     
     
				border: 1px solid lightgray;
				margin: 20px auto;
			}
		</style>
	</head>
	<body>
		<div id="div"></div>
	</body>
</html>
<script>
	var temp = zrqcj("div");
	temp.load(Date.now());//这个是按照当前时间渲染日期
</script>

var zrqcj = function(id){
    
    
	var $id= $("#"+id);
	$id.addClass("rel");
	var $head = $("<div class='item head'>周末</div><div class='item head'>周一</div><div class='item head'>周二</div><div class='item head'>周三</div><div class='item head'>周四</div><div class='item head'>周五</div><div class='item head'>周六</div>")
	$head.appendTo($id);
	var $lleft  =$("<div class='item tool lleft'><<</div>");
	var $left  =$("<div class='item tool t2 left'><</div>");
	var $val = $("<div class='item tool val'>1</div>");
	var $right =$("<div class='item tool right'>></div>");
	var $rright =$("<div class='item tool rright'>>></div>");
	$lleft.appendTo($id);
	$left.appendTo($id);
	$val.appendTo($id);
	$rright.appendTo($id);
	$right.appendTo($id);
	//首先知道当前时间
	return{
    
    
		$id:$id,
		year:0,
		month:0,
		day:0,
		$lleft:$lleft,
		$left:$left,
		$val:$val,
		$right:$right,
		$rright:$rright,
		load:function(date){
    
    
			var that = this;
			that.draw(date);
			//按钮点击事件
			that.$lleft.click(function(){
    
    
				var str = (parseInt(that.year)-1)+"-"+that.month+"-1";
				that.draw(str);
			})
			that.$rright.click(function(){
    
    
				var str = (parseInt(that.year)+1)+"-"+that.month+"-1";
				that.draw(str);
			})
			that.$left.click(function(){
    
    
				var year = that.year;
				var month = that.month-1;
				year=month<=0?year-=1:year;
				month = month<=0?12:month;
				var str = year+"-"+month+"-1";
				that.draw(str);
			})
			that.$right.click(function(){
    
    
				var year = that.year;
				var month = that.month+1;
				year=month>=13?year+=1:year;
				month = month>=13?1:month;
				var str = year+"-"+month+"-1";
				that.draw(str);
			})
		},
		draw:function(date){
    
    //给指定时间渲染对应的dom
			var that =this;
			that.$id.find(".item:not(.head,.tool)").remove();//除了头部全部删除重新渲染
			var t =new Date(date);//时间对象
			var tt = t.getTime();//时间戳
			var week = t.getDay();//周
			var month = t.getMonth()+1;
			var day = t.getDate();
			//同步当前时间到缓存之中
			that.year = t.getFullYear();
			that.month = month;
			that.day = day;
			//首先算出第一天的时间戳
			var tt0 = tt-1000*60*60*24*(day-1); 
			var t0 = new Date(tt0);
			var week0 = t0.getDay();
			var day0 = t0.getDate();
			var month0 = t0.getMonth(); 
			//然后分割出年月日,知道是周几,然后逐个往前往后填满预计的天
			//假如不是周末,那么就往前部上几天补到周末
			var index= 0;
			var tt1 = tt0;
			//渲染前面的
			while(week0>0){
    
    
				tt1-=1000*60*60*24
				var t1= new Date(tt1);
				var day1 = t1.getDate();
				var year1 = t1.getFullYear();
				var month1 = t1.getMonth();
				var str = year1+"-"+(month1+1)+"-"+day1;
				var $item = $("<div class='item prev' data-date='"+str+"'>"+day1+"</div>");
				$item.appendTo(that.$id);
				week0--;
				index++;
			}
			var tt2 = tt0;
			var t2 = new Date(tt0);
			var month2 = t2.getMonth();
			var day2 = t2.getDate();
			var year2 = t2.getFullYear();
			//渲染这个月的
			while(month2==month0){
    
    
				var str = year2+"-"+(month2+1)+"-"+day2;
				var $item = $("<div class='item' data-date='"+str+"'>"+day2+"</div>");
				$item.appendTo(that.$id);
				if(day2==that.day){
    
    
					$item.addClass("check")
				}
				tt2+=1000*60*60*24;
				t2 = new Date(tt2);
				month2 = t2.getMonth();
				day2 = t2.getDate();
				year2 = t2.getFullYear();
				index++;
			}
			//渲染下个月的
			while(index<42){
    
    
				var str = year2+"-"+(month2+1)+"-"+day2;
				var $item = $("<div class='item next' data-date='"+str+"'>"+day2+"</div>");
				$item.appendTo(that.$id);
				tt2+=1000*60*60*24;
				t2 = new Date(tt2);
				month2 = t2.getMonth();
				day2 = t2.getDate();
				year2 = t2.getFullYear();
				index++;
			}
			//渲染工具val的值
			that.$val.text(that.year+"-"+that.month);
			//这个点击选中事件每次渲染的时候就重新绑定一次算了,我懒得写委托了,关键是这里面我拎不清
			//此外假如这是个有用的控件的话,这个地方就该将数据写到对应的输入框了
			that.$id.find(".item:not(.head,.tool)").click(function(){
    
    
				var str = $(this).attr("data-date");
				that.draw(str);
			})
		}
	}
}

思路解释

  • 还是昨天一样的思路,昨天旨在按照固定格式渲染出一个日期界面,这个格式就是一个日期对象的字符串就成比如yy-mm-dd这个格式,后面的时间部分有没有没差
  • 然后就是今天的部分,把底下的工具部分放了进来,同时在渲染日的时候,把对应的格子记录上他自己的对应的日期值
  • 接着就是完善动作,有了前面的步骤,像什么左右工具跳动年份和月份直接做,最后拼接字符串重新渲染一次就行了,对了,我把渲染部分单独弄成一个方法了
  • 然后选中日期的跳转动作,因为标签已经保存了这个格子的日期对象,所以我将它取出来直接渲染一次就行了
  • 所以这个动作做起来不难,就是前面的渲染得考虑一下怎么和后面的工具动作互相成就
  • 实现的具体思路都在js部分的注释里面了,这里就不多说了,关键还是要知道啥是时间戳。
  • 最后还差一点点了,就是把这玩意变成与input框绑定起来,在选中日期之后将日期填进去,交给明天了,碎觉~

猜你喜欢

转载自blog.csdn.net/weixin_44142582/article/details/113901129