js日历控件开发

最终日历控件实例代码地址:http://www.oschina.net/code/snippet_2352644_55198javascript

 

 什么是日历控件?效果什么样子?这是一个网站上的在线演示效果:http://www.jq22.com/yanshi5303css

咱们开发的最终实现就是大体这个样子,咱们简单把效果的逻辑简单概述:html

  1. 一个inputjava

  2. 咱们点击input会弹出日历控件node

  3. 咱们点击日历控件的日期就会显示到input中express

  4. 日历控件的年月可更改选择cookie

  5. 能够清除input的日期app

咱们这样就简单的概述了这个效果,下面咱们就会出现下面的疑问?函数

在js中,时期是怎么获取和设置!测试

此次的实例开发讲解,会分为2篇,日历控件实例相对来讲要先有准备知识的了解,咱们在之前的博客中只有在cookie中简单介绍过date对象的gmt转化方法。

 

一.date对象基本知识

1.date对象建立

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>date</title>
    <style type="text/css">
  </style>
</head>
<body>
 <input type="text" id="date" value="日历控件"/>
</body>
<script type="text/javascript">
var dateObj = new Date();
alert(typeof dateObj);
</script>
</html>

经过Date类咱们直接可建立date对象,在建立对象,不设置参数的状况下,默认的date对象使用当前时间作参数。

好比今天是2016/4/5那么日期对象的年 月 日分别就是2016 4 5。

2.date对象读取

读取就是拿,拿到日期对象中咱们想要的具体内容,好比:年,月,日,时分秒,等等等。

咱们获取年月日:

var dateObj = new Date();
alert("年:"+dateObj.getFullYear());
alert("月:"+dateObj.getMonth());
alert("日:"+dateObj.getDate());

日期对象月是返回0-11,因此咱们拿到的值+1才是真实月份。

获取周:

var dateObj = new Date();
alert("周:"+dateObj.getDay());

周的特殊之处就是星期日的处理,返回是0。

获取时分秒:

var dateObj = new Date();
alert("时:"+dateObj.getHours());
alert("分:"+dateObj.getMinutes());
alert("秒:"+dateObj.getSeconds());

这里的返回值都是从0开始,0其实就是对应表明了24小时,60分钟,60秒,和周相似。

获取毫秒:

更加精确的时间,不在很特殊时咱们也不会拿去的,和秒的关系 1秒=1000毫秒

var dateObj = new Date();
alert("毫秒:"+dateObj.getMilliseconds());

同理,返回0表明1000毫秒值。

返回 1970 年 1 月 1 日至今的毫秒数:

这个就是unix时间戳的使用了,咱们会拿到距离时间:

var dateObj = new Date();
alert("距离 1970 年 1 月 1 日的毫秒数:"+dateObj.getTime());

咱们采用默认参数,date对象就是当前时间,获取就是这个时间距离1970/1/1的毫秒数。

转为GMTString时间:

这个就是咱们cookie过时时间的使用了:

var dateObj = new Date();
alert("GMTString:"+dateObj.toUTCString());

这实际上是一种日期格式,cookie你必须用这种格式,咱们使用的方法是如今推荐的,toGMTString()不被推荐使用。

其实除了这些,还有根据世界时间的返回,咱们这里就不在介绍了。

3.date对象设置

几乎全部的获取操做,都会对应设置操做,咱们建立了date对象,对象包含各类日期信息(年,月,日等),这些信息其实都是来自new时的参数,咱们默认采用当前。

咱们还能修改对象中的各类信息,修改了咱们在获取,就是拿到修改的信息了。

咱们设置年月日:

var dateObj = new Date();
alert("默认年:"+dateObj.getFullYear());
alert("默认月:"+dateObj.getMonth());
alert("默认日:"+dateObj.getDate());
dateObj.setFullYear(2008);
dateObj.setMonth(8);
dateObj.setDate(8);
alert("修改后年:"+dateObj.getFullYear());
alert("修改后月:"+dateObj.getMonth());
alert("修改后日:"+dateObj.getDate());

咱们先获取默认参数的时间,而后设置指定的年月日,获取时就知道确实修改了对应信息。

其余的时分秒相似不作介绍。

根据距离 1970 年 1 月 1 日至今的毫秒数设置日期对象:

与gettime正好相反的操做,get是拿到毫秒,set是根据毫秒设置修改date的全部信息。

var dateObj = new Date();
alert("默认年:"+dateObj.getFullYear());
alert("默认月:"+dateObj.getMonth());
alert("默认日:"+dateObj.getDate());
var now=dateObj.getTime();//获取1970毫秒
var prev=now-24*60*60*1000;//获取昨天距离1970的毫秒,减去一天的毫秒数,一天是24小时,1小时60分钟,1分钟60秒,1秒是1000毫秒
dateObj.setTime(prev);
alert("修改后年:"+dateObj.getFullYear());
alert("修改后月:"+dateObj.getMonth());
alert("修改后日:"+dateObj.getDate());

 

二.date对象小实例

仅仅知道了date的建立,设置和获取是不足以让咱们灵活运用它,咱们下面经过开发多个小实例,增强咱们对date的使用和了解。

实例1:页面今日日期显示

在一些网站,咱们会看到显示今天的年月日和星期几信息,咱们怎么把这些信息显示到页面当中?

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>date</title>
    <style type="text/css">
 </style>
</head>
<body>
 <input type="text" id="date" value="日历控件"/>
    <div id="show"></div>
</body>
<script type="text/javascript">
var show=document.getElementById("show");
var dateObj = new Date();
var year=dateObj.getFullYear();
var month=dateObj.getMonth();//0是12月
var day=dateObj.getDate();
var week=dateObj.getDay();//0是星期日
show.innerHTML="当前日期"+year+"年"+month+"月"+day+"日"+"星期"+week;
</script>
</html>

截图:

经过截图,咱们看到的已知问题就是月份,月份是要+1的,由于返回值是0-11表明1-12月,一个隐藏问题就是星期,若是是星期日,返回是0;对于转化映射的处理,咱们能够采用js的switch case语句。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>date</title>
    <style type="text/css">
 </style>
</head>
<body>
 <input type="text" id="date" value="日历控件"/>
    <div id="show"></div>
</body>
<script type="text/javascript">
var show=document.getElementById("show");
var dateObj = new Date();
var year=dateObj.getFullYear();
var month=toyear(dateObj.getMonth());//0是12月
var day=dateObj.getDate();
var week=toweek(dateObj.getDay());//0是星期日
show.innerHTML="当前日期"+year+"年"+month+"月"+day+"日"+week;
function toweek(week){
 switch(week)
 {
 case 0:
   return "星期日";
   break;
 case 1:
   return "星期一";
   break;
 case 2:
   return "星期二";
   break;
 case 3:
   return "星期三";
   break;
 case 4:
   return "星期四";
   break;
 case 5:
   return "星期五";
   break;
 case 6:
   return "星期六";
   break;
 default:
  
 }; 
};
function toyear(month){
 switch(month)
 {
 case 0:
   return "1";
   break;
 case 1:
   return "2";
   break;
 case 2:
   return "3";
   break;
 case 3:
   return "4";
   break;
 case 4:
   return "5";
   break;
 case 5:
   return "6";
   break;
 case 6:
   return "7";
   break;
 case 7:
   return "8";
   break;
 case 8:
   return "9";
   break;
 case 9:
   return "10";
   break;
 case 10:
   return "11";
   break;
 case 11:
   return "12";
   break;         
 default:
  
 }; 
};
</script>
</html>

截图:

达到咱们想要的结果。

实例2:简单时钟

一个时钟,就会包含时分秒这些信息,而且会动态变化,咱们利用常用的setinterval函数,而且把间隔设置为1000也就是1秒就正好知足动态变化的需求:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>date</title>
    <style type="text/css">
 </style>
</head>
<body>
 <input type="text" id="date" value="日历控件"/>
    <div id="show"></div>
</body>
<script type="text/javascript">
var show=document.getElementById("show");
var dateObj = new Date();
var hour=tohour(dateObj.getHours());
var minu=tominu(dateObj.getMinutes());
var sec=tosec(dateObj.getSeconds());
show.innerHTML=hour+"时"+minu+"分"+sec+"秒";
setInterval(function(){ 
 dateObj = new Date();
 hour=tohour(dateObj.getHours());
 minu=tominu(dateObj.getMinutes());
 sec=tosec(dateObj.getSeconds());
 show.innerHTML=hour+"时"+minu+"分"+sec+"秒";
},1000);
function tohour(t){
 if(t==0){
  return 24;
 }else{
  return t;
 };
};
function tominu(t){
 if(t==0){
  return 60;
 }else{
  return t;
 };
};
function tosec(t){
 if(t==0){
  return 60;
 }else{
  return t;
 };
};
</script>
</html>

效果截图:

 

三.本月日历

1.静态结构建立

今天是2016年4月5日,咱们想要把4月的全部信息显示出来,而且把5日特殊标记,大概样子是这样的:

最上面的月和年是比较简单的,咱们直接获取就能够了,下面的内容就比较麻烦了,咱们分析发现,

1.本月的信息会所有显示,

2.并且1号这一天根据它所在的周,要在前面出现留空位置,

3.5这个就是当前日,加入特殊标记。

咱们先不考虑动态处理问题,咱们先把静态结构完成,用写死的形式把这个效果写出来:

效果截图:

代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>date</title>
    <style type="text/css">
 #box{width:350px;}
 #title{width:350px; height:50px;}
 #month{ float:left;width:60px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #year{float:left;width:80px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #week{ width:350px;height:50px;}
 #week div{ float:left; width:48px; height:48px; margin:1px; background:#C90; color:#fff; text-align:center; line-height:48px; cursor:pointer;}
 #con{ width:350px;}
 #con div{ float:left; width:48px; height:48px; margin:1px; background:#999; color:#333; text-align:center; line-height:48px; cursor:pointer;}
 #con div.now{background:#09F; color:#fff;}
 </style>
</head>
<body>
 <div id="box">
     <div id="title">
         <div id="month"></div>
            <div id="year"></div>
        </div>
        <div id="week">
         <div>日</div>
            <div>一</div>
            <div>二</div>
            <div>三</div>
            <div>四</div>
            <div>五</div>
            <div>六</div>
        </div>
        <div id="con">
         <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div>1</div>
            <div>2</div>
            
            <div>3</div>
            <div>4</div>
            <div class="now">5</div>
            <div>6</div>
            <div>7</div>
            <div>8</div>
            <div>9</div>
            
            <div>10</div>
            <div>11</div>
            <div>12</div>
            <div>13</div>
            <div>14</div>
            <div>15</div>
            <div>16</div>
            
            <div>17</div>
            <div>18</div>
            <div>19</div>
            <div>20</div>
            <div>21</div>
            <div>22</div>
            <div>23</div>
            
            <div>24</div>
            <div>25</div>
            <div>26</div>
            <div>27</div>
            <div>28</div>
            <div>29</div>
            <div>30</div>
        </div>
    </div>
</body>
<script type="text/javascript">
window.onload=function(){
 var omonth=document.getElementById("month");
 var oyear=document.getElementById("year");
 var dateObj = new Date();
 var year=dateObj.getFullYear();
 var month=toyear(dateObj.getMonth());//0是12月
 omonth.innerHTML=month+"月";
 oyear.innerHTML=year+"年";
 
 function toyear(month){ 
  switch(month) { 
  case 0:   return "1";   break; 
  case 1:   return "2";   break; 
  case 2:   return "3";   break; 
  case 3:   return "4";   break; 
  case 4:   return "5";   break; 
  case 5:   return "6";   break; 
  case 6:   return "7";   break; 
  case 7:   return "8";   break; 
  case 8:   return "9";   break; 
  case 9:   return "10";   break; 
  case 10:   return "11";   break; 
  case 11:   return "12";   break;          
  default:   
  }; 
 };
};
</script>
</html>

2.动态处理日期

咱们把日的显示写死,咱们只要利用动态处理,就能够完成动态建立了,咱们要想完成留空的处理,咱们要获取的信息包含以下:

1.本月1日是星期几?若是是星期5,也就是返回了5,那么留空就是5,是星级1,返回1留空就是1

2.获取这个月日的总个数,这个简单1 3 5 7 8 10 12哈哈,31天永不差,需注意闰年,用做循环建立全部的日

3.返回今日,好比这个例子返回5,再循环中咱们要判断等于5的加入特殊处理

如何获取本月1日信息?

咱们只要先建立一个默认的日期对象,而后利用setdate(1)把对象的日设置为1其实就获取了本月1号的信息,而后然获取所在的周,就首先拿到了留空个数:

//获取本月1号的周值
 var oneyear = new Date();
 oneyear.setDate(1);
 var oneweek=oneyear.getDay();
 alert(oneweek)

很是的完美,下面咱们实现2,也就是拿到本月总的日数,基本规律就是口诀,不过咱们先判断一把是不是闰年,要遇到2月特殊处理:

判断闰年条件①:非整百年数除以4,无余为闰,有余为平;②整百年数除以400,无余为闰有余平。

//闰年判断函数
 function isLeapYear(year) {  
  if( (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)){
   return true;
  }else{
   return false;
  };  
 };

咱们测试输出总日数:

//本月总日数
 var alld=alldays(year,dateObj.getMonth());
 alert(alld);
 //获取本月总日数方法
 function alldays(year,month){
  if(isLeapYear(year)){//闰年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "29";   break;   //2月
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };
  }else{//平年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "28";   break;  //2月 
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };   
  };
 };
 //闰年判断函数
 function isLeapYear(year){  
  if( (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)){
   return true;
  }else{
   return false;
  };  
 };

最后一个重要信息,当前日:

 //当前是几
 var nowd=dateObj.getDate();
 alert(nowd);

准备工做完成,咱们初始化显示咱们的时间:

 //初始化显示本月信息
 init(oneweek,alld,nowd);
 //初始化日期显示方法
 function init(oneweek,alld,nowd){
  for(var i=1;i<=oneweek;i++){//留空
   var eday=document.createElement("div");
   eday.innerHTML="";
   con.appendChild(eday);
  };
  for(var i=1;i<=alld;i++){//正常区域
   var eday=document.createElement("div");
   if(i==nowd){     
    eday.innerHTML=i;
    eday.className="now";
    con.appendChild(eday);
   }else{
    eday.innerHTML=i;
    con.appendChild(eday);
   };
  };
 };

咱们把全部代码整理,看到下面截图效果:

效果没有变,不过内容是经过js添加:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>date</title>
    <style type="text/css">
 #box{width:350px;}
 #title{width:350px; height:50px;}
 #month{ float:left;width:60px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #year{float:left;width:80px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #week{ width:350px;height:50px;}
 #week div{ float:left; width:48px; height:48px; margin:1px; background:#C90; color:#fff; text-align:center; line-height:48px; cursor:pointer;}
 #con{ width:350px;}
 #con div{ float:left; width:48px; height:48px; margin:1px; background:#999; color:#333; text-align:center; line-height:48px; cursor:pointer;}
 #con div.now{background:#09F; color:#fff;}
 </style>
</head>
<body>
 <div id="box">
     <div id="title">
         <div id="month"></div>
            <div id="year"></div>
        </div>
        <div id="week">
         <div>日</div>
            <div>一</div>
            <div>二</div>
            <div>三</div>
            <div>四</div>
            <div>五</div>
            <div>六</div>
        </div>
        <div id="con"></div>
    </div>
</body>
<script type="text/javascript">
window.onload=function(){
 //月年的显示
 var omonth=document.getElementById("month");
 var oyear=document.getElementById("year");
 var con=document.getElementById("con");
 var dateObj = new Date();
 var year=dateObj.getFullYear();
 var month=toyear(dateObj.getMonth());//0是12月
 omonth.innerHTML=month+"月";
 oyear.innerHTML=year+"年";
 //获取本月1号的周值
 var oneyear = new Date();
 oneyear.setDate(1);
 var oneweek=oneyear.getDay();
 //本月总日数
 var alld=alldays(year,dateObj.getMonth());
 //当前是几
 var nowd=dateObj.getDate();
 //初始化显示本月信息
 init(oneweek,alld,nowd);
 //初始化日期显示方法
 function init(oneweek,alld,nowd){
  for(var i=1;i<=oneweek;i++){//留空
   var eday=document.createElement("div");
   eday.innerHTML="";
   con.appendChild(eday);
  };
  for(var i=1;i<=alld;i++){//正常区域
   var eday=document.createElement("div");
   if(i==nowd){     
    eday.innerHTML=i;
    eday.className="now";
    con.appendChild(eday);
   }else{
    eday.innerHTML=i;
    con.appendChild(eday);
   };
  };
 };
 //获取本月总日数方法
 function alldays(year,month){
  if(isLeapYear(year)){//闰年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "29";   break;   //2月
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };
  }else{//平年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "28";   break;  //2月 
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };   
  };
 };
 //闰年判断函数
 function isLeapYear(year){  
  if( (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)){
   return true;
  }else{
   return false;
  };  
 };
 //月份转化方法
 function toyear(month){ 
  switch(month) { 
  case 0:   return "1";   break; 
  case 1:   return "2";   break; 
  case 2:   return "3";   break; 
  case 3:   return "4";   break; 
  case 4:   return "5";   break; 
  case 5:   return "6";   break; 
  case 6:   return "7";   break; 
  case 7:   return "8";   break; 
  case 8:   return "9";   break; 
  case 9:   return "10";   break; 
  case 10:   return "11";   break; 
  case 11:   return "12";   break;          
  default:   
  }; 
 };
};
</script>
</html>

 

四.动态日历

什么是动态,就是能够利用上一页或者下一页查看上一个月,下一个月,上上一个月的日历信息!

咱们把本身程序进一步优化,让更多的获取来自函数:

通过一顿的修正,咱们把近乎全部获取操做都经过new的date实现:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>date</title>
    <style type="text/css">
 #box{width:350px;}
 #title{width:350px; height:50px;}
 #month{ float:left;width:60px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #year{float:left;width:80px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #week{ width:350px;height:50px;}
 #week div{ float:left; width:48px; height:48px; margin:1px; background:#C90; color:#fff; text-align:center; line-height:48px; cursor:pointer;}
 #con{ width:350px;}
 #con div{ float:left; width:48px; height:48px; margin:1px; background:#999; color:#333; text-align:center; line-height:48px; cursor:pointer;}
 #con div.now{background:#09F; color:#fff;}
 </style>
</head>
<body>
 <div id="box">
     <div id="title">
         <div id="month"></div>
            <div id="year"></div>
        </div>
        <div id="week">
         <div>日</div>
            <div>一</div>
            <div>二</div>
            <div>三</div>
            <div>四</div>
            <div>五</div>
            <div>六</div>
        </div>
        <div id="con"></div>
    </div>
</body>
<script type="text/javascript">
window.onload=function(){
 //===================get ele=============================== 
 var omonth=document.getElementById("month");
 var oyear=document.getElementById("year");
 var con=document.getElementById("con");
 //===================set year month===============================
 //默认时间对象
 var dateObj = new Date();
 var year=dateObj.getFullYear();
 var month=toyear(dateObj);//0是12月
 //月年的显示
 omonth.innerHTML=month+"月";
 oyear.innerHTML=year+"年";
 //===================set day===============================
 //获取本月1号的周值
 var oneweek=oneyearoneday(dateObj);
 //本月总日数
 var alld=alldays(dateObj);
 //当前是几
 var nowd=nowday(dateObj);
 //初始化显示本月信息
 init(oneweek,alld,nowd);
 
 //===================function===============================
 //初始化日期显示方法
 function init(oneweek,alld,nowd){
  for(var i=1;i<=oneweek;i++){//留空
   var eday=document.createElement("div");
   eday.innerHTML="";
   con.appendChild(eday);
  };
  for(var i=1;i<=alld;i++){//正常区域
   var eday=document.createElement("div");
   if(i==nowd){     
    eday.innerHTML=i;
    eday.className="now";
    con.appendChild(eday);
   }else{
    eday.innerHTML=i;
    con.appendChild(eday);
   };
  };
 };
 //获取本月1号的周值
 function oneyearoneday(dateObj){
  var oneyear = new Date();
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();//0是12月
  oneyear.setFullYear(year);
  oneyear.setMonth(month);//0是12月
  oneyear.setDate(1);
  return oneyear.getDay();  
 };
 //当前是几
 function nowday(dateObj){
  return dateObj.getDate();
 };
 //获取本月总日数方法
 function alldays(dateObj){
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();
  if(isLeapYear(year)){//闰年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "29";   break;   //2月
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };
  }else{//平年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "28";   break;  //2月 
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };   
  };
 };
 //闰年判断函数
 function isLeapYear(year){  
  if( (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)){
   return true;
  }else{
   return false;
  };  
 };
 //月份转化方法
 function toyear(dateObj){ 
  var month=dateObj.getMonth()
  switch(month) { 
  case 0:   return "1";   break; 
  case 1:   return "2";   break; 
  case 2:   return "3";   break; 
  case 3:   return "4";   break; 
  case 4:   return "5";   break; 
  case 5:   return "6";   break; 
  case 6:   return "7";   break; 
  case 7:   return "8";   break; 
  case 8:   return "9";   break; 
  case 9:   return "10";   break; 
  case 10:   return "11";   break; 
  case 11:   return "12";   break;          
  default:   
  }; 
 };
};
</script>
</html>

咱们如何检验结果的活跃性呢?咱们只要把new date的月份作一次修改,就能够检测结果了:

设置为上一个月,看结果:

有些完美了是否是,咱们试想若是这中设置方式结合页面处理,是否是就成就了咱们的实现,。

 

五.加入上一月下一月

咱们先修改结构,加入上一月和下一月的按钮:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>date</title>
    <style type="text/css">
 #box{width:350px;}
 #title{width:350px; height:50px;}
 #month{ float:left;width:60px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #year{float:left;width:80px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #week{ width:350px;height:50px;}
 #week div{ float:left; width:48px; height:48px; margin:1px; background:#C90; color:#fff; text-align:center; line-height:48px; cursor:pointer;}
 #con{ width:350px;}
 #con div{ float:left; width:48px; height:48px; margin:1px; background:#999; color:#333; text-align:center; line-height:48px; cursor:pointer;}
 #con div.now{background:#09F; color:#fff;}
 
 #prevmonth,#nextmonth{float:left;width:50px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 </style>
</head>
<body>
 <div id="box">
     <div id="title">
         <div id="prevmonth">&lt;</div>
         <div id="month"></div>
            <div id="year"></div>
            <div id="nextmonth">&gt;</div>
        </div>
        <div id="week">
         <div>日</div>
            <div>一</div>
            <div>二</div>
            <div>三</div>
            <div>四</div>
            <div>五</div>
            <div>六</div>
        </div>
        <div id="con"></div>
    </div>
</body>
<script type="text/javascript">
window.onload=function(){
 //===================get ele=============================== 
 var omonth=document.getElementById("month");
 var oyear=document.getElementById("year");
 var con=document.getElementById("con");
 //===================set year month===============================
 //默认时间对象
 var dateObj = new Date();
 //动态控制
 //dateObj.setMonth(1);
 //年月获取 
 var year=dateObj.getFullYear();
 var month=toyear(dateObj);//0是12月
 //月年的显示
 omonth.innerHTML=month+"月";
 oyear.innerHTML=year+"年";
 //===================set day===============================
 //获取本月1号的周值
 var oneweek=oneyearoneday(dateObj);
 //本月总日数
 var alld=alldays(dateObj);
 //当前是几
 var nowd=nowday(dateObj);
 //初始化显示本月信息
 init(oneweek,alld,nowd);
 
 //===================function===============================
 //初始化日期显示方法
 function init(oneweek,alld,nowd){
  for(var i=1;i<=oneweek;i++){//留空
   var eday=document.createElement("div");
   eday.innerHTML="";
   con.appendChild(eday);
  };
  for(var i=1;i<=alld;i++){//正常区域
   var eday=document.createElement("div");
   if(i==nowd){     
    eday.innerHTML=i;
    eday.className="now";
    con.appendChild(eday);
   }else{
    eday.innerHTML=i;
    con.appendChild(eday);
   };
  };
 };
 //获取本月1号的周值
 function oneyearoneday(dateObj){
  var oneyear = new Date();
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();//0是12月
  oneyear.setFullYear(year);
  oneyear.setMonth(month);//0是12月
  oneyear.setDate(1);
  return oneyear.getDay();  
 };
 //当前是几
 function nowday(dateObj){
  return dateObj.getDate();
 };
 //获取本月总日数方法
 function alldays(dateObj){
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();
  if(isLeapYear(year)){//闰年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "29";   break;   //2月
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };
  }else{//平年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "28";   break;  //2月 
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };   
  };
 };
 //闰年判断函数
 function isLeapYear(year){  
  if( (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)){
   return true;
  }else{
   return false;
  };  
 };
 //月份转化方法
 function toyear(dateObj){ 
  var month=dateObj.getMonth()
  switch(month) { 
  case 0:   return "1";   break; 
  case 1:   return "2";   break; 
  case 2:   return "3";   break; 
  case 3:   return "4";   break; 
  case 4:   return "5";   break; 
  case 5:   return "6";   break; 
  case 6:   return "7";   break; 
  case 7:   return "8";   break; 
  case 8:   return "9";   break; 
  case 9:   return "10";   break; 
  case 10:   return "11";   break; 
  case 11:   return "12";   break;          
  default:   
  }; 
 };
};
</script>
</html>

效果截图:

如今咱们就要进一步处理,就是点击上一个月或者一下月修改日的显示,而且上面的年月也要修改,不断上一月咱们会到2015年甚至更之前。

 

六.开发上一月下一月控制程序

拿到:

var prevmonth=document.getElementById("prevmonth");
 var nextmonth=document.getElementById("nextmonth");

事件就是单击事件了,咱们简单处理:

 prevmonth.onclick=function(){//上一月
  
 };
 nextmonth.onclick=function(){//下一月
  
 };

贪多嚼不烂,咱们先把上一月处理好,再去看下一月:

上一月,就和上篇博客最后同样,咱们只要把月设置为当前-1;

//动态控制
 prevmonth.onclick=function(){//上一月
  var ddm=dateObj.getMonth()-1;
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);
 };

固然,二次赋值前先清除:

function remove(){
  con.innerHTML="";
 };

咱们还要加个判断限制,当处在1月,在点击上一月,年要发生变化,月变为上一年的12月:

 prevmonth.onclick=function(){//上一月
  var ddm=null;
  var ddy=null;
  if((dateObj.getMonth()-1)==-1){
   ddm=11;
   ddy=dateObj.getFullYear()-1;
  }else{
   ddm=dateObj.getMonth()-1;
   ddy=dateObj.getFullYear();
  };
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);
 };

看如今所有代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>date</title>
    <style type="text/css">
 #box{width:350px;}
 #title{width:350px; height:50px;}
 #month{ float:left;width:60px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #year{float:left;width:80px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #week{ width:350px;height:50px;}
 #week div{ float:left; width:48px; height:48px; margin:1px; background:#C90; color:#fff; text-align:center; line-height:48px; cursor:pointer;}
 #con{ width:350px;}
 #con div{ float:left; width:48px; height:48px; margin:1px; background:#999; color:#333; text-align:center; line-height:48px; cursor:pointer;}
 #con div.now{background:#09F; color:#fff;}
 
 #prevmonth,#nextmonth{float:left;width:50px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 </style>
</head>
<body>
 <div id="box">
     <div id="title">
         <div id="prevmonth">&lt;</div>
         <div id="month"></div>
            <div id="year"></div>
            <div id="nextmonth">&gt;</div>
        </div>
        <div id="week">
         <div>日</div>
            <div>一</div>
            <div>二</div>
            <div>三</div>
            <div>四</div>
            <div>五</div>
            <div>六</div>
        </div>
        <div id="con"></div>
    </div>
</body>
<script type="text/javascript">
window.onload=function(){
 //===================get ele=============================== 
 var omonth=document.getElementById("month");
 var oyear=document.getElementById("year");
 var con=document.getElementById("con");
 var prevmonth=document.getElementById("prevmonth");
 var nextmonth=document.getElementById("nextmonth");
 //===================set year month===============================
 //默认时间对象
 var dateObj = new Date();
 //动态控制
 prevmonth.onclick=function(){//上一月
  var ddm=null;
  var ddy=null;
  if((dateObj.getMonth()-1)==-1){
   ddm=11;
   ddy=dateObj.getFullYear()-1;
  }else{
   ddm=dateObj.getMonth()-1;
   ddy=dateObj.getFullYear();
  };
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);
 };
 nextmonth.onclick=function(){//下一月
  
 };
 //年月获取 
 var year=dateObj.getFullYear();
 var month=toyear(dateObj);//0是12月
 //月年的显示
 omonth.innerHTML=month+"月";
 oyear.innerHTML=year+"年";
 //===================set day===============================
 //获取本月1号的周值
 var oneweek=oneyearoneday(dateObj);
 //本月总日数
 var alld=alldays(dateObj);
 //当前是几
 var nowd=nowday(dateObj);
 //初始化显示本月信息
 init(oneweek,alld,nowd);
 
 //===================function===============================
 //初始化日期显示方法
 function remove(){
  con.innerHTML="";
 };
 function init(oneweek,alld,nowd){
  for(var i=1;i<=oneweek;i++){//留空
   var eday=document.createElement("div");
   eday.innerHTML="";
   con.appendChild(eday);
  };
  for(var i=1;i<=alld;i++){//正常区域
   var eday=document.createElement("div");
   if(i==nowd){     
    eday.innerHTML=i;
    eday.className="now";
    con.appendChild(eday);
   }else{
    eday.innerHTML=i;
    con.appendChild(eday);
   };
  };
 };
 //获取本月1号的周值
 function oneyearoneday(dateObj){
  var oneyear = new Date();
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();//0是12月
  oneyear.setFullYear(year);
  oneyear.setMonth(month);//0是12月
  oneyear.setDate(1);
  return oneyear.getDay();  
 };
 //当前是几
 function nowday(dateObj){
  return dateObj.getDate();
 };
 //获取本月总日数方法
 function alldays(dateObj){
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();
  if(isLeapYear(year)){//闰年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "29";   break;   //2月
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };
  }else{//平年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "28";   break;  //2月 
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };   
  };
 };
 //闰年判断函数
 function isLeapYear(year){  
  if( (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)){
   return true;
  }else{
   return false;
  };  
 };
 //月份转化方法
 function toyear(dateObj){ 
  var month=dateObj.getMonth()
  switch(month) { 
  case 0:   return "1";   break; 
  case 1:   return "2";   break; 
  case 2:   return "3";   break; 
  case 3:   return "4";   break; 
  case 4:   return "5";   break; 
  case 5:   return "6";   break; 
  case 6:   return "7";   break; 
  case 7:   return "8";   break; 
  case 8:   return "9";   break; 
  case 9:   return "10";   break; 
  case 10:   return "11";   break; 
  case 11:   return "12";   break;          
  default:   
  }; 
 };
};
</script>
</html>

咱们补全下一月处理,测试:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>date</title>
    <style type="text/css">
 #box{width:350px;}
 #title{width:350px; height:50px;}
 #month{ float:left;width:60px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #year{float:left;width:80px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #week{ width:350px;height:50px;}
 #week div{ float:left; width:48px; height:48px; margin:1px; background:#C90; color:#fff; text-align:center; line-height:48px; cursor:pointer;}
 #con{ width:350px;}
 #con div{ float:left; width:48px; height:48px; margin:1px; background:#999; color:#333; text-align:center; line-height:48px; cursor:pointer;}
 #con div.now{background:#09F; color:#fff;}
 
 #prevmonth,#nextmonth{float:left;width:50px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 </style>
</head>
<body>
 <div id="box">
     <div id="title">
         <div id="prevmonth">&lt;</div>
         <div id="month"></div>
            <div id="year"></div>
            <div id="nextmonth">&gt;</div>
        </div>
        <div id="week">
         <div>日</div>
            <div>一</div>
            <div>二</div>
            <div>三</div>
            <div>四</div>
            <div>五</div>
            <div>六</div>
        </div>
        <div id="con"></div>
    </div>
</body>
<script type="text/javascript">
window.onload=function(){
 //===================get ele=============================== 
 var omonth=document.getElementById("month");
 var oyear=document.getElementById("year");
 var con=document.getElementById("con");
 var prevmonth=document.getElementById("prevmonth");
 var nextmonth=document.getElementById("nextmonth");
 //===================set year month===============================
 //默认时间对象
 var dateObj = new Date();
 //动态控制
 prevmonth.onclick=function(){//上一月
  var ddm=null;
  var ddy=null;
  if((dateObj.getMonth()-1)==-1){
   ddm=11;
   ddy=dateObj.getFullYear()-1;
  }else{
   ddm=dateObj.getMonth()-1;
   ddy=dateObj.getFullYear();
  };
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);
 };
 nextmonth.onclick=function(){//下一月
  var ddm=null;
  var ddy=null;
  if((dateObj.getMonth()+1)==12){
   ddm=0;
   ddy=dateObj.getFullYear()+1;
  }else{
   ddm=dateObj.getMonth()+1;
   ddy=dateObj.getFullYear();
  };
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);  
 };
 //年月获取 
 var year=dateObj.getFullYear();
 var month=toyear(dateObj);//0是12月
 //月年的显示
 omonth.innerHTML=month+"月";
 oyear.innerHTML=year+"年";
 //===================set day===============================
 //获取本月1号的周值
 var oneweek=oneyearoneday(dateObj);
 //本月总日数
 var alld=alldays(dateObj);
 //当前是几
 var nowd=nowday(dateObj);
 //初始化显示本月信息
 init(oneweek,alld,nowd);
 
 //===================function===============================
 //初始化日期显示方法
 function remove(){
  con.innerHTML="";
 };
 function init(oneweek,alld,nowd){
  for(var i=1;i<=oneweek;i++){//留空
   var eday=document.createElement("div");
   eday.innerHTML="";
   con.appendChild(eday);
  };
  for(var i=1;i<=alld;i++){//正常区域
   var eday=document.createElement("div");
   if(i==nowd){     
    eday.innerHTML=i;
    eday.className="now";
    con.appendChild(eday);
   }else{
    eday.innerHTML=i;
    con.appendChild(eday);
   };
  };
 };
 //获取本月1号的周值
 function oneyearoneday(dateObj){
  var oneyear = new Date();
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();//0是12月
  oneyear.setFullYear(year);
  oneyear.setMonth(month);//0是12月
  oneyear.setDate(1);
  return oneyear.getDay();  
 };
 //当前是几
 function nowday(dateObj){
  return dateObj.getDate();
 };
 //获取本月总日数方法
 function alldays(dateObj){
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();
  if(isLeapYear(year)){//闰年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "29";   break;   //2月
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };
  }else{//平年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "28";   break;  //2月 
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };   
  };
 };
 //闰年判断函数
 function isLeapYear(year){  
  if( (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)){
   return true;
  }else{
   return false;
  };  
 };
 //月份转化方法
 function toyear(dateObj){ 
  var month=dateObj.getMonth()
  switch(month) { 
  case 0:   return "1";   break; 
  case 1:   return "2";   break; 
  case 2:   return "3";   break; 
  case 3:   return "4";   break; 
  case 4:   return "5";   break; 
  case 5:   return "6";   break; 
  case 6:   return "7";   break; 
  case 7:   return "8";   break; 
  case 8:   return "9";   break; 
  case 9:   return "10";   break; 
  case 10:   return "11";   break; 
  case 11:   return "12";   break;          
  default:   
  }; 
 };
};
</script>
</html>

 

七.开发上一年下一年控制程序

和月份处理相似,我直接粘贴代码了:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>date</title>
    <style type="text/css">
 #box{width:350px;}
 #title{width:350px; height:50px;}
 #month{ float:left;width:60px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #year{float:left;width:80px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #week{ width:350px;height:50px;}
 #week div{ float:left; width:48px; height:48px; margin:1px; background:#C90; color:#fff; text-align:center; line-height:48px; cursor:pointer;}
 #con{ width:350px;}
 #con div{ float:left; width:48px; height:48px; margin:1px; background:#999; color:#333; text-align:center; line-height:48px; cursor:pointer;}
 #con div.now{background:#09F; color:#fff;}
 
 #prevmonth,#nextmonth,#prevyear,#nextyear{float:left;width:50px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 </style>
</head>
<body>
 <div id="box">
     <div id="title">
         <div id="prevyear">&lt;&lt;</div>
         <div id="prevmonth">&lt;</div>
         <div id="month"></div>
            <div id="year"></div>
            <div id="nextmonth">&gt;</div>
            <div id="nextyear">&gt;&gt;</div>
        </div>
        <div id="week">
         <div>日</div>
            <div>一</div>
            <div>二</div>
            <div>三</div>
            <div>四</div>
            <div>五</div>
            <div>六</div>
        </div>
        <div id="con"></div>
    </div>
</body>
<script type="text/javascript">
window.onload=function(){
 //===================get ele=============================== 
 var omonth=document.getElementById("month");
 var oyear=document.getElementById("year");
 var con=document.getElementById("con");
 var prevmonth=document.getElementById("prevmonth");
 var nextmonth=document.getElementById("nextmonth");
 var prevyear=document.getElementById("prevyear");
 var nextyear=document.getElementById("nextyear");
 //===================set year month===============================
 //默认时间对象
 var dateObj = new Date();
 //动态控制
 prevmonth.onclick=function(){//上一月
  var ddm=null;
  var ddy=null;
  if((dateObj.getMonth()-1)==-1){
   ddm=11;
   ddy=dateObj.getFullYear()-1;
  }else{
   ddm=dateObj.getMonth()-1;
   ddy=dateObj.getFullYear();
  };
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);
 };
 nextmonth.onclick=function(){//下一月
  var ddm=null;
  var ddy=null;
  if((dateObj.getMonth()+1)==12){
   ddm=0;
   ddy=dateObj.getFullYear()+1;
  }else{
   ddm=dateObj.getMonth()+1;
   ddy=dateObj.getFullYear();
  };
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);  
 };
 prevyear.onclick=function(){//上一年
  var ddy=dateObj.getFullYear()-1;
  dateObj.setFullYear(ddy);
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);
 };
 nextyear.onclick=function(){//下一年
  var ddy=dateObj.getFullYear()+1;
  dateObj.setFullYear(ddy);
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);  
 }; 
 //年月获取 
 var year=dateObj.getFullYear();
 var month=toyear(dateObj);//0是12月
 //月年的显示
 omonth.innerHTML=month+"月";
 oyear.innerHTML=year+"年";
 //===================set day===============================
 //获取本月1号的周值
 var oneweek=oneyearoneday(dateObj);
 //本月总日数
 var alld=alldays(dateObj);
 //当前是几
 var nowd=nowday(dateObj);
 //初始化显示本月信息
 init(oneweek,alld,nowd);
 
 //===================function===============================
 //初始化日期显示方法
 function remove(){
  con.innerHTML="";
 };
 function init(oneweek,alld,nowd){
  for(var i=1;i<=oneweek;i++){//留空
   var eday=document.createElement("div");
   eday.innerHTML="";
   con.appendChild(eday);
  };
  for(var i=1;i<=alld;i++){//正常区域
   var eday=document.createElement("div");
   if(i==nowd){     
    eday.innerHTML=i;
    eday.className="now";
    con.appendChild(eday);
   }else{
    eday.innerHTML=i;
    con.appendChild(eday);
   };
  };
 };
 //获取本月1号的周值
 function oneyearoneday(dateObj){
  var oneyear = new Date();
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();//0是12月
  oneyear.setFullYear(year);
  oneyear.setMonth(month);//0是12月
  oneyear.setDate(1);
  return oneyear.getDay();  
 };
 //当前是几
 function nowday(dateObj){
  return dateObj.getDate();
 };
 //获取本月总日数方法
 function alldays(dateObj){
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();
  if(isLeapYear(year)){//闰年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "29";   break;   //2月
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };
  }else{//平年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "28";   break;  //2月 
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };   
  };
 };
 //闰年判断函数
 function isLeapYear(year){  
  if( (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)){
   return true;
  }else{
   return false;
  };  
 };
 //月份转化方法
 function toyear(dateObj){ 
  var month=dateObj.getMonth()
  switch(month) { 
  case 0:   return "1";   break; 
  case 1:   return "2";   break; 
  case 2:   return "3";   break; 
  case 3:   return "4";   break; 
  case 4:   return "5";   break; 
  case 5:   return "6";   break; 
  case 6:   return "7";   break; 
  case 7:   return "8";   break; 
  case 8:   return "9";   break; 
  case 9:   return "10";   break; 
  case 10:   return "11";   break; 
  case 11:   return "12";   break;          
  default:   
  }; 
 };
};
</script>
</html>

到这一步,咱们的日历控件已经出具模型了。

 

八.返回当前时期

咱们应该加一个按钮,无论处在那一年,咱们均可以点击后当即回到今时今日:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>date</title>
    <style type="text/css">
 *{ margin:0; padding:0;}
 a{ text-decoration:none; outline:none;}
 body a{outline:none;blr:expression(this.onFocus=this.blur());}
 img{ border:none;}
 ul{ list-style:none;}
 body{ color:#666666; font-size:14px; font-family:"微软雅黑"; background-color:#fff; height:100%; overflow-y:scroll;*overflow-y:inherit;}
 /*html{ height:100%;}*/
 .clearfix:after{ content:"."; display:block; height:0; clear:both; overflow:hidden;}
 .clearfix{ zoom:1;}

 #box{width:350px;}
 #title{width:350px; height:50px;}
 #month{ float:left;width:60px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #year{float:left;width:80px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #week{ width:350px;height:50px;}
 #week div{ float:left; width:48px; height:48px; margin:1px; background:#C90; color:#fff; text-align:center; line-height:48px; cursor:pointer;}
 #con{ width:350px;}
 #con div{ float:left; width:48px; height:48px; margin:1px; background:#999; color:#333; text-align:center; line-height:48px; cursor:pointer;}
 #con div.now{background:#09F; color:#fff;}
 
 #prevmonth,#nextmonth,#prevyear,#nextyear{float:left;width:50px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 
 #btns{width:350px; height:40px;}
 #nowtime{ float:left; margin:5px; height:30px; line-height:30px; padding:0 5px; background:#09F; cursor:pointer; border-radius:5px;}
 #nowtime:hover{background:#ddd;}
 </style>
</head>
<body>
 <div id="box">
     <div id="title">
         <div id="prevyear">&lt;&lt;</div>
         <div id="prevmonth">&lt;</div>
         <div id="month"></div>
            <div id="year"></div>
            <div id="nextmonth">&gt;</div>
            <div id="nextyear">&gt;&gt;</div>
        </div>
        <div id="week">
         <div>日</div>
            <div>一</div>
            <div>二</div>
            <div>三</div>
            <div>四</div>
            <div>五</div>
            <div>六</div>
        </div>
        <div id="con" class="clearfix"></div>
        <div id="btns">
         <div id="nowtime">当前时间</div>
        </div>
    </div>
</body>
<script type="text/javascript">
window.onload=function(){
 //===================get ele=============================== 
 var omonth=document.getElementById("month");
 var oyear=document.getElementById("year");
 var con=document.getElementById("con");
 var prevmonth=document.getElementById("prevmonth");
 var nextmonth=document.getElementById("nextmonth");
 var prevyear=document.getElementById("prevyear");
 var nextyear=document.getElementById("nextyear");
 var nowtime=document.getElementById("nowtime");
 //===================set year month===============================
 //默认时间对象
 var dateObj = new Date();
 //动态控制
 prevmonth.onclick=function(){//上一月
  var ddm=null;
  var ddy=null;
  if((dateObj.getMonth()-1)==-1){
   ddm=11;
   ddy=dateObj.getFullYear()-1;
  }else{
   ddm=dateObj.getMonth()-1;
   ddy=dateObj.getFullYear();
  };
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);
 };
 nextmonth.onclick=function(){//下一月
  var ddm=null;
  var ddy=null;
  if((dateObj.getMonth()+1)==12){
   ddm=0;
   ddy=dateObj.getFullYear()+1;
  }else{
   ddm=dateObj.getMonth()+1;
   ddy=dateObj.getFullYear();
  };
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);  
 };
 prevyear.onclick=function(){//上一年
  var ddy=dateObj.getFullYear()-1;
  dateObj.setFullYear(ddy);
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);
 };
 nextyear.onclick=function(){//下一年
  var ddy=dateObj.getFullYear()+1;
  dateObj.setFullYear(ddy);
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);  
 }; 
 //返回到今时今日
 nowtime.onclick=function(){
  var dddate=new Date();
  var ddm=dddate.getMonth();
  var ddy=dddate.getFullYear();
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);  
 };
 //年月获取 
 var year=dateObj.getFullYear();
 var month=toyear(dateObj);//0是12月
 //月年的显示
 omonth.innerHTML=month+"月";
 oyear.innerHTML=year+"年";
 //===================set day===============================
 //获取本月1号的周值
 var oneweek=oneyearoneday(dateObj);
 //本月总日数
 var alld=alldays(dateObj);
 //当前是几
 var nowd=nowday(dateObj);
 //初始化显示本月信息
 init(oneweek,alld,nowd);
 
 //===================function===============================
 //初始化日期显示方法
 function remove(){
  con.innerHTML="";
 };
 function init(oneweek,alld,nowd){
  for(var i=1;i<=oneweek;i++){//留空
   var eday=document.createElement("div");
   eday.innerHTML="";
   con.appendChild(eday);
  };
  for(var i=1;i<=alld;i++){//正常区域
   var eday=document.createElement("div");
   if(i==nowd){     
    eday.innerHTML=i;
    eday.className="now";
    con.appendChild(eday);
   }else{
    eday.innerHTML=i;
    con.appendChild(eday);
   };
  };
 };
 //获取本月1号的周值
 function oneyearoneday(dateObj){
  var oneyear = new Date();
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();//0是12月
  oneyear.setFullYear(year);
  oneyear.setMonth(month);//0是12月
  oneyear.setDate(1);
  return oneyear.getDay();  
 };
 //当前是几
 function nowday(dateObj){
  return dateObj.getDate();
 };
 //获取本月总日数方法
 function alldays(dateObj){
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();
  if(isLeapYear(year)){//闰年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "29";   break;   //2月
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };
  }else{//平年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "28";   break;  //2月 
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };   
  };
 };
 //闰年判断函数
 function isLeapYear(year){  
  if( (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)){
   return true;
  }else{
   return false;
  };  
 };
 //月份转化方法
 function toyear(dateObj){ 
  var month=dateObj.getMonth()
  switch(month) { 
  case 0:   return "1";   break; 
  case 1:   return "2";   break; 
  case 2:   return "3";   break; 
  case 3:   return "4";   break; 
  case 4:   return "5";   break; 
  case 5:   return "6";   break; 
  case 6:   return "7";   break; 
  case 7:   return "8";   break; 
  case 8:   return "9";   break; 
  case 9:   return "10";   break; 
  case 10:   return "11";   break; 
  case 11:   return "12";   break;          
  default:   
  }; 
 };
};
</script>
</html>

 

九.与输入文本框绑定

个人时间控件默认是不可见的在input获取焦点时才会显示:

默认隐藏,最简单就是直接none掉,input获取焦点咱们blcok,位置利用绝对定位,获取input相对页面的left和top赋值给box便可:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>date</title>
    <style type="text/css">
 *{ margin:0; padding:0;}
 a{ text-decoration:none; outline:none;}
 body a{outline:none;blr:expression(this.onFocus=this.blur());}
 img{ border:none;}
 ul{ list-style:none;}
 body{ color:#666666; font-size:14px; font-family:"微软雅黑"; background-color:#fff; height:100%; overflow-y:scroll;*overflow-y:inherit;}
 /*html{ height:100%;}*/
 .clearfix:after{ content:"."; display:block; height:0; clear:both; overflow:hidden;}
 .clearfix{ zoom:1;}

 #box{width:350px; position:absolute;}
 #title{width:350px; height:50px;}
 #month{ float:left;width:60px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #year{float:left;width:80px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #week{ width:350px;height:50px;}
 #week div{ float:left; width:48px; height:48px; margin:1px; background:#C90; color:#fff; text-align:center; line-height:48px; cursor:pointer;}
 #con{ width:350px;}
 #con div{ float:left; width:48px; height:48px; margin:1px; background:#CCC; color:#333; text-align:center; line-height:48px; cursor:pointer;}
 #con .edate{background:#999;}
 #con .edate:hover{background:#09F; color:#fff;}
 #con div.now{background:#09F; color:#fff;}
 
 #prevmonth,#nextmonth,#prevyear,#nextyear{float:left;width:50px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 
 #btns{width:350px; height:40px;}
 #nowtime{ float:left; margin:5px; height:30px; line-height:30px; padding:0 5px; background:#09F; cursor:pointer; border-radius:5px;}
 #nowtime:hover{background:#ddd;}
 </style>
</head>
<body>
 <input type="text" id="date" value="" style="height:40px; line-height:40px; margin:200px;"/>
 <div id="box" style="display:none;">
     <div id="title">
         <div id="prevyear">&lt;&lt;</div>
         <div id="prevmonth">&lt;</div>
         <div id="month"></div>
            <div id="year"></div>
            <div id="nextmonth">&gt;</div>
            <div id="nextyear">&gt;&gt;</div>
        </div>
        <div id="week">
         <div>日</div>
            <div>一</div>
            <div>二</div>
            <div>三</div>
            <div>四</div>
            <div>五</div>
            <div>六</div>
        </div>
        <div id="con" class="clearfix"></div>
        <div id="btns">
         <div id="nowtime">当前时间</div>
        </div>
    </div>
</body>
<script type="text/javascript">
window.onload=function(){ 
 //===================get ele=============================== 
 var omonth=document.getElementById("month");
 var oyear=document.getElementById("year");
 var con=document.getElementById("con");
 var prevmonth=document.getElementById("prevmonth");
 var nextmonth=document.getElementById("nextmonth");
 var prevyear=document.getElementById("prevyear");
 var nextyear=document.getElementById("nextyear");
 var nowtime=document.getElementById("nowtime");
 var date=document.getElementById("date");
 var box=document.getElementById("box");
 //===================show date===============================
 date.onfocus=function(){//显示控件
  var datel=this.getBoundingClientRect().left;
  var datet=this.getBoundingClientRect().top+40;
  box.style.left=datel+"px";
  box.style.top=datet+"px";
  box.style.display="block";
 }; 
 con.onclick=function(event){
  if(event.target.tagName=="DIV" && event.target.nodeType=="1" && hasclass(event.target.className,"edate")){
   date.value="";
   date.value=dateObj.getFullYear()+"-"+toyear(dateObj)+"-"+event.target.innerHTML;
   box.style.display="none";
  };
 };
 //===================set year month===============================
 //默认时间对象
 var dateObj = new Date();
 //动态控制
 prevmonth.onclick=function(){//上一月
  var ddm=null;
  var ddy=null;
  if((dateObj.getMonth()-1)==-1){
   ddm=11;
   ddy=dateObj.getFullYear()-1;
  }else{
   ddm=dateObj.getMonth()-1;
   ddy=dateObj.getFullYear();
  };
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);
 };
 nextmonth.onclick=function(){//下一月
  var ddm=null;
  var ddy=null;
  if((dateObj.getMonth()+1)==12){
   ddm=0;
   ddy=dateObj.getFullYear()+1;
  }else{
   ddm=dateObj.getMonth()+1;
   ddy=dateObj.getFullYear();
  };
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);  
 };
 prevyear.onclick=function(){//上一年
  var ddy=dateObj.getFullYear()-1;
  dateObj.setFullYear(ddy);
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);
 };
 nextyear.onclick=function(){//下一年
  var ddy=dateObj.getFullYear()+1;
  dateObj.setFullYear(ddy);
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);  
 }; 
 //返回到今时今日
 nowtime.onclick=function(){
  var dddate=new Date();
  var ddm=dddate.getMonth();
  var ddy=dddate.getFullYear();
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);  
 };
 //年月获取 
 var year=dateObj.getFullYear();
 var month=toyear(dateObj);//0是12月
 //月年的显示
 omonth.innerHTML=month+"月";
 oyear.innerHTML=year+"年";
 //===================set day===============================
 //获取本月1号的周值
 var oneweek=oneyearoneday(dateObj);
 //本月总日数
 var alld=alldays(dateObj);
 //当前是几
 var nowd=nowday(dateObj);
 //初始化显示本月信息
 init(oneweek,alld,nowd);
 
 //===================function===============================
 //有无指定类名的判断
 function hasclass(str,cla){
  var i=str.search(cla);
  if(i==-1){
   return false;
  }else{
   return true;
  };
 };
 //初始化日期显示方法
 function remove(){
  con.innerHTML="";
 };
 function init(oneweek,alld,nowd){
  for(var i=1;i<=oneweek;i++){//留空
   var eday=document.createElement("div");
   eday.innerHTML="";
   con.appendChild(eday);
  };
  for(var i=1;i<=alld;i++){//正常区域
   var eday=document.createElement("div");
   if(i==nowd){     
    eday.innerHTML=i;
    eday.className="now edate";
    con.appendChild(eday);
   }else{
    eday.innerHTML=i;
    eday.className="edate";
    con.appendChild(eday);
   };
  };
 };
 //获取本月1号的周值
 function oneyearoneday(dateObj){
  var oneyear = new Date();
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();//0是12月
  oneyear.setFullYear(year);
  oneyear.setMonth(month);//0是12月
  oneyear.setDate(1);
  return oneyear.getDay();  
 };
 //当前是几
 function nowday(dateObj){
  return dateObj.getDate();
 };
 //获取本月总日数方法
 function alldays(dateObj){
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();
  if(isLeapYear(year)){//闰年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "29";   break;   //2月
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };
  }else{//平年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "28";   break;  //2月 
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };   
  };
 };
 //闰年判断函数
 function isLeapYear(year){  
  if( (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)){
   return true;
  }else{
   return false;
  };  
 };
 //月份转化方法
 function toyear(dateObj){ 
  var month=dateObj.getMonth()
  switch(month) { 
  case 0:   return "1";   break; 
  case 1:   return "2";   break; 
  case 2:   return "3";   break; 
  case 3:   return "4";   break; 
  case 4:   return "5";   break; 
  case 5:   return "6";   break; 
  case 6:   return "7";   break; 
  case 7:   return "8";   break; 
  case 8:   return "9";   break; 
  case 9:   return "10";   break; 
  case 10:   return "11";   break; 
  case 11:   return "12";   break;          
  default:   
  }; 
 };
};
</script>
</html>

在点击日历我加入了三个判断,都是保证正确值的点击处理

 

十.清空操做

这个就很是简单了,咱们加入清空按钮:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>date</title>
    <style type="text/css">
 *{ margin:0; padding:0;}
 a{ text-decoration:none; outline:none;}
 body a{outline:none;blr:expression(this.onFocus=this.blur());}
 img{ border:none;}
 ul{ list-style:none;}
 body{ color:#666666; font-size:14px; font-family:"微软雅黑"; background-color:#fff; height:100%; overflow-y:scroll;*overflow-y:inherit;}
 /*html{ height:100%;}*/
 .clearfix:after{ content:"."; display:block; height:0; clear:both; overflow:hidden;}
 .clearfix{ zoom:1;}

 #box{width:350px; position:absolute;}
 #title{width:350px; height:50px;}
 #month{ float:left;width:60px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #year{float:left;width:80px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #week{ width:350px;height:50px;}
 #week div{ float:left; width:48px; height:48px; margin:1px; background:#C90; color:#fff; text-align:center; line-height:48px; cursor:pointer;}
 #con{ width:350px;}
 #con div{ float:left; width:48px; height:48px; margin:1px; background:#CCC; color:#333; text-align:center; line-height:48px; cursor:pointer;}
 #con .edate{background:#999;}
 #con .edate:hover{background:#09F; color:#fff;}
 #con div.now{background:#09F; color:#fff;}
 
 #prevmonth,#nextmonth,#prevyear,#nextyear{float:left;width:50px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 
 #btns{width:350px; height:40px;}
 #nowtime{ float:left; margin:5px; height:30px; line-height:30px; padding:0 5px; background:#09F; cursor:pointer; border-radius:5px;}
 #nowtime:hover{background:#ddd;}
 #cleartime{float:left; margin:5px; height:30px; line-height:30px; padding:0 5px; background:#09F; cursor:pointer; border-radius:5px;}
 </style>
</head>
<body>
 <input type="text" id="date" value="" style="height:40px; line-height:40px; margin:200px;"/>
 <div id="box" style="display:none;">
     <div id="title">
         <div id="prevyear">&lt;&lt;</div>
         <div id="prevmonth">&lt;</div>
         <div id="month"></div>
            <div id="year"></div>
            <div id="nextmonth">&gt;</div>
            <div id="nextyear">&gt;&gt;</div>
        </div>
        <div id="week">
         <div>日</div>
            <div>一</div>
            <div>二</div>
            <div>三</div>
            <div>四</div>
            <div>五</div>
            <div>六</div>
        </div>
        <div id="con" class="clearfix"></div>
        <div id="btns">
         <div id="nowtime">当前时间</div>
            <div id="cleartime">清空</div>
        </div>
    </div>
</body>
<script type="text/javascript">
window.onload=function(){ 
 //===================get ele=============================== 
 var omonth=document.getElementById("month");
 var oyear=document.getElementById("year");
 var con=document.getElementById("con");
 var prevmonth=document.getElementById("prevmonth");
 var nextmonth=document.getElementById("nextmonth");
 var prevyear=document.getElementById("prevyear");
 var nextyear=document.getElementById("nextyear");
 var nowtime=document.getElementById("nowtime");
 var date=document.getElementById("date");
 var box=document.getElementById("box");
 var cleartime=document.getElementById("cleartime");
 //===================show date===============================
 date.onfocus=function(){//显示控件
  var datel=this.getBoundingClientRect().left;
  var datet=this.getBoundingClientRect().top+40;
  box.style.left=datel+"px";
  box.style.top=datet+"px";
  box.style.display="block";
 }; 
 con.onclick=function(event){
  if(event.target.tagName=="DIV" && event.target.nodeType=="1" && hasclass(event.target.className,"edate")){
   date.value="";
   date.value=dateObj.getFullYear()+"-"+toyear(dateObj)+"-"+event.target.innerHTML;
   box.style.display="none";
  };
 };
 cleartime.onclick=function(event){
  date.value="";
 };
 //===================set year month===============================
 //默认时间对象
 var dateObj = new Date();
 //动态控制
 prevmonth.onclick=function(){//上一月
  var ddm=null;
  var ddy=null;
  if((dateObj.getMonth()-1)==-1){
   ddm=11;
   ddy=dateObj.getFullYear()-1;
  }else{
   ddm=dateObj.getMonth()-1;
   ddy=dateObj.getFullYear();
  };
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);
 };
 nextmonth.onclick=function(){//下一月
  var ddm=null;
  var ddy=null;
  if((dateObj.getMonth()+1)==12){
   ddm=0;
   ddy=dateObj.getFullYear()+1;
  }else{
   ddm=dateObj.getMonth()+1;
   ddy=dateObj.getFullYear();
  };
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);  
 };
 prevyear.onclick=function(){//上一年
  var ddy=dateObj.getFullYear()-1;
  dateObj.setFullYear(ddy);
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);
 };
 nextyear.onclick=function(){//下一年
  var ddy=dateObj.getFullYear()+1;
  dateObj.setFullYear(ddy);
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);  
 }; 
 //返回到今时今日
 nowtime.onclick=function(){
  var dddate=new Date();
  var ddm=dddate.getMonth();
  var ddy=dddate.getFullYear();
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);  
 };
 //年月获取 
 var year=dateObj.getFullYear();
 var month=toyear(dateObj);//0是12月
 //月年的显示
 omonth.innerHTML=month+"月";
 oyear.innerHTML=year+"年";
 //===================set day===============================
 //获取本月1号的周值
 var oneweek=oneyearoneday(dateObj);
 //本月总日数
 var alld=alldays(dateObj);
 //当前是几
 var nowd=nowday(dateObj);
 //初始化显示本月信息
 init(oneweek,alld,nowd);
 
 //===================function===============================
 //有无指定类名的判断
 function hasclass(str,cla){
  var i=str.search(cla);
  if(i==-1){
   return false;
  }else{
   return true;
  };
 };
 //初始化日期显示方法
 function remove(){
  con.innerHTML="";
 };
 function init(oneweek,alld,nowd){
  for(var i=1;i<=oneweek;i++){//留空
   var eday=document.createElement("div");
   eday.innerHTML="";
   con.appendChild(eday);
  };
  for(var i=1;i<=alld;i++){//正常区域
   var eday=document.createElement("div");
   if(i==nowd){     
    eday.innerHTML=i;
    eday.className="now edate";
    con.appendChild(eday);
   }else{
    eday.innerHTML=i;
    eday.className="edate";
    con.appendChild(eday);
   };
  };
 };
 //获取本月1号的周值
 function oneyearoneday(dateObj){
  var oneyear = new Date();
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();//0是12月
  oneyear.setFullYear(year);
  oneyear.setMonth(month);//0是12月
  oneyear.setDate(1);
  return oneyear.getDay();  
 };
 //当前是几
 function nowday(dateObj){
  return dateObj.getDate();
 };
 //获取本月总日数方法
 function alldays(dateObj){
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();
  if(isLeapYear(year)){//闰年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "29";   break;   //2月
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };
  }else{//平年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "28";   break;  //2月 
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };   
  };
 };
 //闰年判断函数
 function isLeapYear(year){  
  if( (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)){
   return true;
  }else{
   return false;
  };  
 };
 //月份转化方法
 function toyear(dateObj){ 
  var month=dateObj.getMonth()
  switch(month) { 
  case 0:   return "1";   break; 
  case 1:   return "2";   break; 
  case 2:   return "3";   break; 
  case 3:   return "4";   break; 
  case 4:   return "5";   break; 
  case 5:   return "6";   break; 
  case 6:   return "7";   break; 
  case 7:   return "8";   break; 
  case 8:   return "9";   break; 
  case 9:   return "10";   break; 
  case 10:   return "11";   break; 
  case 11:   return "12";   break;          
  default:   
  }; 
 };
};
</script>
</html>

 

十一.生产完整代码

对比参照控件,咱们几乎没有差异了。

其实一个页面能够有多个input,这时候咱们的时间控件结构应该经过js插入生成,固然更多的扩展等你来加入:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>date</title>
    <style type="text/css">
 *{ margin:0; padding:0;}
 a{ text-decoration:none; outline:none;}
 body a{outline:none;blr:expression(this.onFocus=this.blur());}
 img{ border:none;}
 ul{ list-style:none;}
 body{ color:#666666; font-size:14px; font-family:"微软雅黑"; background-color:#fff; height:100%; overflow-y:scroll;*overflow-y:inherit;}
 /*html{ height:100%;}*/
 .clearfix:after{ content:"."; display:block; height:0; clear:both; overflow:hidden;}
 .clearfix{ zoom:1;}

 #box{width:350px; position:absolute;}
 #title{width:350px; height:50px;}
 #month{ float:left;width:60px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #year{float:left;width:80px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 #week{ width:350px;height:50px;}
 #week div{ float:left; width:48px; height:48px; margin:1px; background:#C90; color:#fff; text-align:center; line-height:48px; cursor:pointer;}
 #con{ width:350px;}
 #con div{ float:left; width:48px; height:48px; margin:1px; background:#CCC; color:#333; text-align:center; line-height:48px; cursor:pointer;}
 #con .edate{background:#999;}
 #con .edate:hover{background:#09F; color:#fff;}
 #con div.now{background:#09F; color:#fff;}
 
 #prevmonth,#nextmonth,#prevyear,#nextyear{float:left;width:50px; height:50px;text-align:center;cursor:pointer;line-height:50px;}
 
 #btns{width:350px; height:40px;}
 #nowtime{ float:left; margin:5px; height:30px; line-height:30px; padding:0 5px; background:#09F; cursor:pointer; border-radius:5px;}
 #nowtime:hover{background:#ddd;}
 #cleartime{float:left; margin:5px; height:30px; line-height:30px; padding:0 5px; background:#09F; cursor:pointer; border-radius:5px;}
 </style>
</head>
<body>
 <input type="text" id="date" value="" style="height:40px; line-height:40px; margin:200px;"/>
 <div id="box" style="display:none;">
     <div id="title">
         <div id="prevyear">&lt;&lt;</div>
         <div id="prevmonth">&lt;</div>
         <div id="month"></div>
            <div id="year"></div>
            <div id="nextmonth">&gt;</div>
            <div id="nextyear">&gt;&gt;</div>
        </div>
        <div id="week">
         <div>日</div>
            <div>一</div>
            <div>二</div>
            <div>三</div>
            <div>四</div>
            <div>五</div>
            <div>六</div>
        </div>
        <div id="con" class="clearfix"></div>
        <div id="btns">
         <div id="nowtime">当前时间</div>
            <div id="cleartime">清空</div>
        </div>
    </div>
</body>
<script type="text/javascript">
window.onload=function(){ 
 //===================get ele=============================== 
 var omonth=document.getElementById("month");
 var oyear=document.getElementById("year");
 var con=document.getElementById("con");
 var prevmonth=document.getElementById("prevmonth");
 var nextmonth=document.getElementById("nextmonth");
 var prevyear=document.getElementById("prevyear");
 var nextyear=document.getElementById("nextyear");
 var nowtime=document.getElementById("nowtime");
 var date=document.getElementById("date");
 var box=document.getElementById("box");
 var cleartime=document.getElementById("cleartime");
 //===================show date===============================
 date.onfocus=function(){//显示控件
  var datel=this.getBoundingClientRect().left;
  var datet=this.getBoundingClientRect().top+40;
  box.style.left=datel+"px";
  box.style.top=datet+"px";
  box.style.display="block";
 }; 
 con.onclick=function(event){
  if(event.target.tagName=="DIV" && event.target.nodeType=="1" && hasclass(event.target.className,"edate")){
   date.value="";
   date.value=dateObj.getFullYear()+"-"+toyear(dateObj)+"-"+event.target.innerHTML;
   box.style.display="none";
  };
 };
 cleartime.onclick=function(event){
  date.value="";
 };
 //===================set year month===============================
 //默认时间对象
 var dateObj = new Date();
 //动态控制
 prevmonth.onclick=function(){//上一月
  var ddm=null;
  var ddy=null;
  if((dateObj.getMonth()-1)==-1){
   ddm=11;
   ddy=dateObj.getFullYear()-1;
  }else{
   ddm=dateObj.getMonth()-1;
   ddy=dateObj.getFullYear();
  };
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);
 };
 nextmonth.onclick=function(){//下一月
  var ddm=null;
  var ddy=null;
  if((dateObj.getMonth()+1)==12){
   ddm=0;
   ddy=dateObj.getFullYear()+1;
  }else{
   ddm=dateObj.getMonth()+1;
   ddy=dateObj.getFullYear();
  };
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);  
 };
 prevyear.onclick=function(){//上一年
  var ddy=dateObj.getFullYear()-1;
  dateObj.setFullYear(ddy);
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);
 };
 nextyear.onclick=function(){//下一年
  var ddy=dateObj.getFullYear()+1;
  dateObj.setFullYear(ddy);
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);  
 }; 
 //返回到今时今日
 nowtime.onclick=function(){
  var dddate=new Date();
  var ddm=dddate.getMonth();
  var ddy=dddate.getFullYear();
  dateObj.setFullYear(ddy);
  dateObj.setMonth(ddm);
  omonth.innerHTML=toyear(dateObj)+"月";
  oyear.innerHTML=dateObj.getFullYear()+"年";
  remove();
  oneweek=oneyearoneday(dateObj);
  alld=alldays(dateObj);
  nowd=nowday(dateObj);
  init(oneweek,alld,nowd);  
 };
 //年月获取 
 var year=dateObj.getFullYear();
 var month=toyear(dateObj);//0是12月
 //月年的显示
 omonth.innerHTML=month+"月";
 oyear.innerHTML=year+"年";
 //===================set day===============================
 //获取本月1号的周值
 var oneweek=oneyearoneday(dateObj);
 //本月总日数
 var alld=alldays(dateObj);
 //当前是几
 var nowd=nowday(dateObj);
 //初始化显示本月信息
 init(oneweek,alld,nowd);
 
 //===================function===============================
 //有无指定类名的判断
 function hasclass(str,cla){
  var i=str.search(cla);
  if(i==-1){
   return false;
  }else{
   return true;
  };
 };
 //初始化日期显示方法
 function remove(){
  con.innerHTML="";
 };
 function init(oneweek,alld,nowd){
  for(var i=1;i<=oneweek;i++){//留空
   var eday=document.createElement("div");
   eday.innerHTML="";
   con.appendChild(eday);
  };
  for(var i=1;i<=alld;i++){//正常区域
   var eday=document.createElement("div");
   if(i==nowd){     
    eday.innerHTML=i;
    eday.className="now edate";
    con.appendChild(eday);
   }else{
    eday.innerHTML=i;
    eday.className="edate";
    con.appendChild(eday);
   };
  };
 };
 //获取本月1号的周值
 function oneyearoneday(dateObj){
  var oneyear = new Date();
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();//0是12月
  oneyear.setFullYear(year);
  oneyear.setMonth(month);//0是12月
  oneyear.setDate(1);
  return oneyear.getDay();  
 };
 //当前是几
 function nowday(dateObj){
  return dateObj.getDate();
 };
 //获取本月总日数方法
 function alldays(dateObj){
  var year=dateObj.getFullYear();
  var month=dateObj.getMonth();
  if(isLeapYear(year)){//闰年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "29";   break;   //2月
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };
  }else{//平年
   switch(month) {   
   case 0:   return "31";   break;   
   case 1:   return "28";   break;  //2月 
   case 2:   return "31";   break;   
   case 3:   return "30";   break;   
   case 4:   return "31";   break;   
   case 5:   return "30";   break;   
   case 6:   return "31";   break;   
   case 7:   return "31";   break;   
   case 8:   return "30";   break;   
   case 9:   return "31";   break;   
   case 10:   return "30";   break;   
   case 11:   return "31";   break;            
   default:     
   };   
  };
 };
 //闰年判断函数
 function isLeapYear(year){  
  if( (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)){
   return true;
  }else{
   return false;
  };  
 };
 //月份转化方法
 function toyear(dateObj){ 
  var month=dateObj.getMonth()
  switch(month) { 
  case 0:   return "1";   break; 
  case 1:   return "2";   break; 
  case 2:   return "3";   break; 
  case 3:   return "4";   break; 
  case 4:   return "5";   break; 
  case 5:   return "6";   break; 
  case 6:   return "7";   break; 
  case 7:   return "8";   break; 
  case 8:   return "9";   break; 
  case 9:   return "10";   break; 
  case 10:   return "11";   break; 
  case 11:   return "12";   break;          
  default:   
  }; 
 };
};
</script>
</html>
相关文章
相关标签/搜索