首页 > 编程 > JavaScript > 正文

一起学写js Calender日历控件

2019-11-20 10:15:51
字体:
来源:转载
供稿:网友

最近看了一下关于js日期的一些函数,突然想到了日历控件,于是试着写了一个,作为后台程序员的我水平有限,大家抱着学习的态度看看我写的这个例子吧,一起学习进步!

首先一个常用的日期函数:

Date(year,month,day)

 var   date=new  Date();

获取年份

var   year=this.date.getFullYear();

获取月份,这里是月索引所以要+1

var   month=this.date.getMonth()+1;

获取当天是几号

var   day=this.date.getDate();

获取当天是周几,返回0.周日   1.周一  2.周二  3.周三  4.周四  5.周五  6.周六

var   week=this.date.getDay();

 获取当月一号是周几      

 var   getWeekDay=function(year,month,day){      var date=new Date(year,month,day);      return date.getDay();      }   var  weekstart= getWeekDay(this.year, this.month-1, 1)

获取当月的天数

var getMonthDays=function(year,month){      var date=new Date(year,month,0);      return date.getDate();    }var  monthdays= this.getMonthDays(this.year,this.month);

 好了,我们用到的参数就这么多,后面其实就是关于日期对应周几的一些操作和判断,动态的拼接标签,下面就直接把我写的例子发出来:

效果图:

<html>  <meta http-equiv="content-type" content="text/html;charset=utf-8"><head>  <style type="text/css">td{ text-align: center;}  </style>  <script type="text/javascript">   window.onload=function(){  var  Calender=function(){    this.Init.apply(this,arguments);  }  Calender.prototype={    Init:function(container,options){      this.date=new Date();      this.year=this.date.getFullYear();      this.month=this.date.getMonth()+1;      this.day=this.date.getDate();      this.week=this.date.getDay();      this.weekstart=this.getWeekDay(this.year, this.month-1, 1);      this.monthdays= this.getMonthDays(this.year,this.month);      this.containerDiv=document.getElementById(container);      this.options=options!=null?options:{        border:'1px solid green',        width:'400px',        height:'200px',        backgroundColor:'lightgrey',        fontColor:'blue'      }    },    getMonthDays:function(year,month){      var date=new Date(year,month,0);      return date.getDate();    },    getWeekDay:function(year,month,day){      var date=new Date(year,month,day);      return date.getDay();    },    View:function(){      var tablestr='<table>';       tablestr+='<tr><td colspan="3"></td><td>年:'+this.year+'</td><td colspan="3">月:'+this.month+'</td></tr>';      tablestr+='<tr><td width="14%">日</td><td width="14%">一</td><td width="14%">二</td><td width="14%">三</td><td width="14%">四</td><td width="14%">五</td><td width="14%">六</td></tr>';      var index=1;      //判断每月的第一天在哪个位置      var style='';      if(this.weekstart<7)      {        tablestr+='<tr>';         for (var i = 0; i <this.weekstart; i++) {           tablestr+='<td></td>';         };         for (var i = 0; i < 7-this.weekstart; i++) {          style=this.day==(i+1)?"background-Color:green;":"";           index++;           tablestr+='<td style="'+style+'" val='+(this.year+'-'+this.month+'-'+(i+1))+'>'+(i+1)+'</td>';         };        tablestr+='</tr>';      }      ///剩余天数对应的位置      //判断整数行并且对应相应的位置      var remaindays=this.monthdays-(7-this.weekstart);      var row=Math.floor(remaindays%7==0?remaindays/7:((remaindays/7)+1)) ;      var  count=Math.floor(remaindays/7);      for (var i = 0; i < count; i++) {         tablestr+='<tr>';         for (var k = 0; k < 7; k++) {           style=this.day==(index+k)?"background-Color:green;":"";           tablestr+='<td style="'+style+'" val='+(this.year+'-'+this.month+'-'+(index+k))+'>';           tablestr+=index+k;           tablestr+='</td>';         };         tablestr+='</tr>';         index+=7;      };      //最后剩余的天数对应的位置(不能填充一周的那几天)      var remaincols=this.monthdays-(index-1);      tablestr+='<tr>';      for (var i = 0; i < remaincols; i++) {        style=this.day==index?"background-Color:green;":"";        tablestr+='<td style="'+style+'" val='+(this.year+'-'+this.month+'-'+(index))+'>';        tablestr+=index;        tablestr+='</td>';        index++;      };      tablestr+='</tr>';      tablestr+='</table>';      return tablestr;    },    Render:function(){      var calenderDiv=document.createElement('div');      calenderDiv.style.border=this.options.border;      calenderDiv.style.width=this.options.width;      calenderDiv.style.height=this.options.height;      calenderDiv.style.cursor='pointer';      calenderDiv.style.backgroundColor=this.options.backgroundColor;      // calenderDiv.style.color=this.options.fontColor;      calenderDiv.style.color='red' ;      calenderDiv.onclick=function(e){        var evt=e||window.event;        var  target=evt.srcElement||evt.target;        if(target&&target.getAttribute('val'))        {          alert(target.getAttribute('val'));        }            }      var tablestr=this.View();      this.tablestr=tablestr;      calenderDiv.innerHTML=tablestr;      var div=document.createElement('div');      div.style.width='auto';      div.style.height='auto';       div.appendChild(calenderDiv);       ///翻页div      var pagerDiv=document.createElement('div');      pagerDiv.style.width='auto';      pagerDiv.style.height='auto';        var that=this;        ///重新设置参数      var  resetPara=function(year,month,day){          that.date=new Date(year,month,day);          that.year=that.date.getFullYear();          that.month=that.date.getMonth()+1;          that.day=that.date.getDate();          that.week=that.date.getDay();          that.weekstart=that.getWeekDay(that.year, that.month-1, 1);          that.monthdays= that.getMonthDays(that.year,that.month);      }      //上一页      var preBtn=document.createElement('input');       preBtn.type='button';       preBtn.value='<';       preBtn.onclick=function(){           that.containerDiv.removeChild(div);           resetPara(that.year,that.month-2,that.day);           that.Render();       }       //下一页       var nextBtn=document.createElement('input');       nextBtn.type='button';       nextBtn.value='>';            nextBtn.onclick=function(){           that.containerDiv.removeChild(div);           resetPara(that.year,that.month,that.day);           that.Render();       }       pagerDiv.appendChild(preBtn);       pagerDiv.appendChild(nextBtn);       div.appendChild(pagerDiv);       var dropDiv=document.createElement('div');       var  dropdivstr='';       //选择年份       dropdivstr+='<select id="ddlYear">';       for (var i = 1900; i <= 2100; i++) {        dropdivstr+=         i==that.year        ?'<option value="'+i+'" selected="true">'+i+'</option>'        : '<option value="'+i+'">'+i+'</option>';       };       dropdivstr+='</select>';            //选择月份      dropdivstr+='<select id="ddlMonth">';       for (var i = 1; i <= 12; i++) {        dropdivstr+=        i==that.month        ?'<option value="'+i+'" selected="true">'+i+'</option>'        : '<option value="'+i+'">'+i+'</option>';       };       dropdivstr+='</select>';       dropDiv.innerHTML=dropdivstr;       div.appendChild(dropDiv);      that.containerDiv.appendChild(div);         ///绑定选择年份和月份的事件       var ddlChange=function(){           var ddlYear=document.getElementById('ddlYear');          var ddlMonth=document.getElementById('ddlMonth');          var  yearIndex=ddlYear.selectedIndex;          var year=ddlYear.options[yearIndex].value;          var  monthIndex=ddlMonth.selectedIndex;          var month=ddlMonth.options[monthIndex].value;          that.containerDiv.removeChild(div);          resetPara(year,month-1,that.day);          that.Render();       }      ddlYear.onchange=function(){         ddlChange();      }       ddlMonth.onchange=function(){         ddlChange();              }    }  }  var  calender=new Calender('dvTest',{        border:'1px solid green',        width:'400px',        height:'200px',        backgroundColor:''        }        );  calender.Render(); }  </script>  </head><body> <div id="dvTest"></div></body></html>

代码重新做了改动,将视图的table换为了div,是为了解决IE的tableinnerHTML的只读问题。另外加了options是为了可配置性。
上面代码有简单说明,功能是最基础的,如果更深入的做可以进行扩展,希望这篇文章可以给大家一些启发。

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