软件设计 2017-05-22
昨天,我接到的公司老司机的命令,要求我完成一个万年历,目的是想通过日历来利用ajax显示报名信息。平时不怎么重视日历的我遇到了很多麻烦,幸好在公司的一台机器上找到了问题解决的思路。虽然不知道这位sir是谁,但是我还是要感谢他,他的思路让我明白了什么是闰年,什么是小月大月,跳转月份的规则...总之,如果你看到了的话烦请您联系我一声,我会摆平所有的阻碍为你献上一卷卫生纸表达感激!
接下来就是万年历小程序的内容(使用js编写):
1:HTML层
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>日历</title> <link rel="stylesheet" type="text/css" href="Calendar.css"> <script type="text/javascript" src="Calendar.js"></script> </head> <body> <div id="calendar" class="calendar"> <div class="prev"> <button id="prev_M">上个月</button> </div> <span id="month">月<span id="year">年 <div class="next"> <button id="next_M">下个月</button> </div> </div> <div style="clear:both"></div> <!--日历主体--> <div id="calendar_weektitle"></div> <div id="calendar_weekday"></div> <div style="clear:both;"></div> <!--报名信息--> <div id="regis">● 是否可报名</div> <div id="instalment">月份/批次</div> </body> </html>
2:CSS ceng
.calendar{ font-family: "-apple-system", "Helvetica Neue", "Roboto", "Segoe UI", sans-serif; width: 490px; text-align: center; overflow: hidden; } #calendar_weekday{ width: 500px; } #calendar_weektitle{ width: 500px; } .prev{ cursor: pointer; float: left; /* padding-right: px;*/ } .next{ cursor: pointer; float: right; /* padding-right: px;*/ } #calendar_weekday div,#calendar_weektitle div{ border-bottom: 1px solid #cccccc; font-size: 11px; font-family: "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif; } #calendar_weekday div{ color: #adadad; } #calendar_weekday > div:hover{ background-color: #ffcd3c; opacity: .5; } #regis,#instalment{ line-height: 35px; font-family: "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; width: 490px; padding-left: 20px; } #regis{ background-color: #ffd96a; height: 40px; } #instalment{ border-bottom: 1px solid red; /*line-height: 30px;*/ height: 36px; }
3:javascript ceng !important
/** * Created by heart on 2017/4/26. */ window.onload = function(){ //为日历写入月份头部 function Calendar(){ var weeks = ['日', '一', '二', '三', '四', '五', '六']; for(i = 0; i < weeks.length; i++){ var div = document.createElement('div'); div.id = 'week_' + i; div.innerHTML = weeks[i]; div.style.width = '14%'; div.style.height = '35px'; div.style.lineHeight = div.style.height; div.style.backgroundColor = '#ccc'; div.style.float = 'left'; div.style.textAlign = 'center'; document.getElementById('calendar_weektitle').appendChild(div); } alert("1"); } //构造原型对象 Calendar.prototype = { //取闰年函数 isLeap : function(year){ return (year % 100 !== 0 && year % 4 == 0) || (year % 400 == 0); }, //返回本年本月的天数 getDaysNum : function(year, month) { var num = 31; //大月 switch (month) { case '2': num = this.isLeap(year) ? 29 : 28; break; //小月 case 4: case 6: case 9: case 11: num = 30; break; } return num; }, //返回本月的第一天是周几 getWeek : function(year, month){ var d = new Date(); // var m=d.getMonth()+1; // var y=d.getYear(); d.setYear(year); d.setMonth(month-1); d.setDate(1); var weeks = ['7', '1', '2', '3', '4', '5', '6']; return weeks[d.getDay()]; }, //核心函数,写入日历 show : function(year, month){ var weekFirstDay = this.getWeek(year, month); var dayCount = this.getDaysNum(year, month); console.log(weekFirstDay); //得到本月头是周几,并在前面插入空天数 if(weekFirstDay != '7'){ for(var i = 0; i < weekFirstDay; i++){ var div_1 = document.createElement('div'); div_1.style.cursor = 'pointer'; div_1.innerHTML = ''; div_1.style.width = '14%'; div_1.style.height = '40px'; // div_1.style.lineHeight = div_1.style.height / 2; div_1.style.float = 'left'; div_1.style.textAlign = 'center'; document.getElementById('calendar_weekday').appendChild(div_1); } } //得到本月的天数,按规则格式注入天数 for(i = 0; i < dayCount; i++){ var div_2 = document.createElement('div'); div_2.style.cursor = 'pointer'; div_2.id = 'day_' + year + '_' + month + '_' + (i + 1); console.log(div_2.id); div_2.innerHTML = i + 1 + '<br />'; div_2.style.width = '14%'; div_2.style.height = '40px'; // div_2.style.lineHeight = div_2.style.height / 2; div_2.style.float = 'left'; div_2.style.textAlign = 'center'; document.getElementById('calendar_weekday').appendChild(div_2); } }, //跳转上个月,月份减一 PreMonth: function() { this.PreDraw(new Date(this.Year, this.Month - 2, 1)); }, //跳转下个月,月份加一 NextMonth: function() { this.PreDraw(new Date(this.Year, this.Month, 1)); }, //重绘 PreDraw: function(date) { this.Year = date.getFullYear(); this.Month = date.getMonth() + 1; this.Draw(); } }; alert('2'); //对象实例化 Calen = new Calendar(); //获取本地时间 var data= new Date(); m = data.getMonth()+1; y =data.getFullYear(); d = data.getDate(); //写入本月天数 Calen.show(y,m); var today = document.getElementById('day_'+ y + '_'+ m + '_' + d); today.style.backgroundColor = '#ffcd3c'; document.getElementById("year").innerHTML = y; document.getElementById("month").innerHTML = m; alert('3'); //跳转到下个月 document.getElementById("next_M").onclick = function(){ var div=document.getElementById("calendar_weekday"); div.innerHTML = ""; if(m > 0&&m < 12){ m += 1; }else if(m > 1){ m = 1; y += 1; }else if(m == 12){ m = 1; y += 1; } Calen.show(y, m); document.getElementById("year").innerHTML = y; document.getElementById("month").innerHTML = m; }; //跳转到上一月 document.getElementById("prev_M").onclick = function(){ var div = document.getElementById("calendar_weekday"); div.innerHTML=""; if(m > 1 && m < 12){ m -= 1; }else if(m <= 1){ m = 12; y-=1; }else if(m == 12){ m -= 1; } Calen.show(y, m); document.getElementById("year").innerHTML = y; document.getElementById("month").innerHTML = m; }; };
对于js程序,我使用的是javascript原型对象开发模式,个人觉得在较复杂的程序中它相对函数式模式更加可视直观。相关的细节描述已在代码的注释中标识;可能在动态样式上有所不足;可能需要在功能上有所补充;代码可取走分析使用。