日历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'><</span><em id='showDate' value='" + _year + "-" + _month + "-" + _day + "'>" + _year + "年" + _month + "月" + _day + "日" + "</em><span class='cld-next'>></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) 收藏 举报
浙公网安备 33010602011771号