日历js代码

  1 //判断闰年
  2 function runNian(_year) {
  3     if(_year%400 === 0 || (_year%4 === 0 && _year%100 !== 0) ) {
  4         return true;
  5     }
  6     else { return false; }
  7 }
  8 //判断某年某月的1号是星期几
  9 function getFirstDay(_year,_month) {
 10     var allDay = 0, y = _year-1, i = 1;
 11     allDay = y + Math.floor(y/4) - Math.floor(y/100) + Math.floor(y/400) + 1;  //公式
 12     //某年的1月1日星期几的公式   result=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7;
 13     // year 是年份,days是当年的天数
 14     for ( ; i<_month; i++) {
 15         switch (i) {
 16             case 1: allDay += 31; break;
 17             case 2: 
 18                 if(runNian(_year)) { allDay += 29; }
 19                 else { allDay += 28; }
 20                 break;
 21             case 3: allDay += 31; break;
 22             case 4: allDay += 30; break;
 23             case 5: allDay += 31; break;
 24             case 6: allDay += 30; break;
 25             case 7: allDay += 31; break;
 26             case 8: allDay += 31; break;
 27             case 9: allDay += 30; break;
 28             case 10: allDay += 31; break;
 29             case 11: allDay += 30; break;
 30             case 12: allDay += 31; break;
 31         }
 32     }
 33     return allDay%7;
 34 }
 35 //显示日历
 36 function showCalendar(_year,_month,_day,firstDay) {
 37     var i = 0,
 38         monthDay = 0,
 39         showStr = "",
 40         _classname = "",
 41         today = new Date();
 42         //月份的天数
 43     switch(_month) {
 44         case 1: monthDay = 31; break;
 45         case 2:
 46             if(runNian(_year)) { monthDay = 29; }
 47             else { monthDay = 28; }
 48             break;
 49         case 3: monthDay = 31; break;
 50         case 4: monthDay = 30; break;
 51         case 5: monthDay = 31; break;
 52         case 6: monthDay = 30; break;
 53         case 7: monthDay = 31; break;
 54         case 8: monthDay = 31; break;
 55         case 9: monthDay = 30; break;
 56         case 10: monthDay = 31; break;
 57         case 11: monthDay = 30; break;
 58         case 12: monthDay = 31; break;
 59     }
 60 
 61     //输出日历表格,这部分因结构而异
 62     showStr = "<table class='cld-w'><thead>";
 63     //日历头部
 64     showStr += "<tr><th colspan='7'><div class='cld-hd'><span class='cld-pre'>&lt;</span><em id='showDate' value='" + _year + "-" + _month + "-" + _day + "'>" + _year + "年" + _month + "月" + _day + "日" + "</em><span class='cld-next'>&gt;</span></div></th></tr>";
 65     //日历星期
 66     showStr += "<tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr>";
 67     showStr += "</thead><tbody><tr>";
 68     //当月第一天前的空格
 69     for (i=1; i<=firstDay; i++) {
 70         showStr += "<td></td>";
 71     }
 72     //显示当前月的天数
 73     for (i=1; i<=monthDay; i++) {
 74         //当日的日期
 75         if(_year === today.getFullYear() && _month === today.getMonth()+1 && i === today.getDate()) {
 76             _classname = "cld-cur"; 
 77         } 
 78         //当日之前的日期(这个判断是因为我有工作需求,就是要求之前的日期不能点击)
 79         else if(_year < today.getFullYear() || (_year === today.getFullYear() && _month <= today.getMonth()) || (_year === today.getFullYear() && _month === today.getMonth()+1 && i < today.getDate()) ) {
 80             _classname = "cld-old";
 81         }
 82         //其他普通的日期
 83         else { _classname = "cld-day"; }
 84         //其他大于当月的月份的相同日期(为了让点击下一月的时候,相同的日期增加cld-cur类)
 85         if(_day === i && (_year > today.getFullYear() || _month > today.getMonth()+1)) { _classname = "cld-cur"; }
 86         //把日期存在对应的value       
 87         showStr += "<td class=" + _classname + " value='" + _year + "-" + _month + "-" + i + "'>" + i + "</td>";
 88 
 89         firstDay = (firstDay+1)%7;
 90         if(firstDay === 0 && i !== monthDay) {
 91             showStr += "</tr><tr>";
 92         } 
 93     }
 94     
 95     //剩余的空格
 96     if(firstDay!==0) {
 97         for (i=firstDay; i<7; i++) {
 98             showStr += "<td></td>";
 99         }
100     }
101         
102     showStr +="</tr></tbody></table>";
103     //插入calendar的页面结构里
104     calendar.innerHTML = showStr;
105 }
106 
107 //显示年月日
108 function showDate(_year,_month,_day) {
109     var date = "", firstDay = getFirstDay(_year,_month,_day);
110     if(_day !== 0) {
111         date = _year + "年" + _month + "月" +_day + "日";
112     }
113     else { date = "No Choose."; }
114     document.getElementById("showDate").innerHTML = date; //日历头部显示
115     showCalendar(_year,_month,_day,firstDay);         //调用日历显示函数
116 }
117 
118 //上一月
119 function preMonth(_year,_month,_day) {
120     if(_month == 1) { showDate(_year - 1,12,_day); }
121     else { showDate(_year,_month - 1,_day); }
122 }
123 //下一月
124 function nextMonth(_year,_month,_day) {
125     if(_month == 12) { showDate(_year + 1,1,_day); }
126     else { showDate(_year,_month + 1,_day); }
127 }
128 //初始化
129 var calendar = document.createElement('div');
130 calendar.setAttribute('id','showCld');
131 document.getElementById("box").appendChild(calendar); //增加到你的box里
132 
133 //获取当天的年月日    
134 var today = new Date();
135 var _year = today.getFullYear(),
136     _month = today.getMonth() + 1,
137     _day = today.getDate();
138 var firstDay = getFirstDay(_year,_month);
139 
140 //显示日历
141 showCalendar(_year,_month,_day,firstDay);
142 
143 //日历点击的事件委托(可以查查js冒泡的应用)
144 calendar.onclick = function(e) {
145     var e = e || window.event;
146     var target = e.srcElement || e.target;
147 //把日历的头部的年月日分割成数组,这里保存在其value属性上
148     dayArr = document.getElementById('showDate').getAttribute('value').split('-');
149     if (target) {
150         //如果是可点击的日期
151         if ( target.className === "cld-day" || target.className === "cld-cur" ) {
152             dateArr = target.getAttribute('value').split('-');
153             //减0是把字符串转化成数值类型,以下一样            
154             showDate(dateArr[0]-0,dateArr[1]-0,dateArr[2]-0);
155             calendar.className = "";
156         } 
157         //如果是上一月的点击
158         else if ( target.className === "cld-pre" ) {
159             preMonth(dayArr[0]-0,dayArr[1]-0,dayArr[2]-0);
160         }
161         //如果是下一月的点击
162         else if ( target.className === "cld-next" ) {
163             nextMonth(dayArr[0]-0,dayArr[1]-0,dayArr[2]-0);
164         }
165     }
166 };

 

posted on 2014-12-04 15:00  rainbow661314  阅读(397)  评论(0)    收藏  举报