小生初来乍到,用jquery结合css、html为页面实现了一个实时日历面板的显示。此过程是我第一次独立完成一个js事件的产生,调试,美化,总的来说过程艰辛(当各种问题出现时一行一行找错emoj‘emoj),但是最终终于实现了,也是很开心的,,,哈哈哈。
首先我们学校开了C++课程,大一学期学了一点基础,更深的技术着实没有掌握,但一些基本的数据类型,语法知识也还是懂一点的。于是类似C语言,js语言学起来也不是那么费劲。
我设置了一个变量,monthMax,用来求本月的最大天数。由于是否为闰年,是否为2月,是否为1357810腊月,于是写了下面函数。
function calendarArr(year,month){
var leap;
var monthMax;
var monthsArr=['1','3','5','7','8','10','12'];
if (year%4==0) {if(year%100==0) {if (year%400==0) {leap=true;}else{leap=false;};}else{leap=true;};}else{leap=false;};
if (month==2) {
if (leap){monthMax=29;}else{monthMax=28;}
} else{
for (var i = 0; i < monthsArr.length; i++) {
if(month==monthsArr[i]){monthMax=31;break;}else{monthMax=30;}
};
}
return monthMax;
};
不知道是否还能更优化些,但是光这些我就得绞尽脑汁,翻翻javascript微软手册,看看怎么实现数组的元素检查。。。。。
接下来获取计算机上显示的日期及本月天数(获取的月份默认从零开始,所以‘+1’f***)
var time=new Date();
var iDays=calendarArr(time.getFullYear(),time.getMonth()+1);//获取本月总天数
然后,我想先把本月的天数一一罗列在面板上,这时遇到了这样的问题,怎么才能很好的把本月的1号先排上去,剩下的直接++就行了。这个面板是按照
sun mon tue wed the fri sur
的顺序来排列日期,所以我产生这样的想法:
先获取本日是星期几,再根据这个数和本日日期来计算出本月1号是星期几。
var temp=7-[iDate+7-(iDay+1)]%7;//console.log(temp);//求出本月一号所对应的星期数。
上面的那个算法我也是笑了,不知道读者有没有在小学时做过这样的一个应用题:
已知一个月里今日是21号,而且今天是星期三,请计算出本月1号是星期几?
。。我就是这么看着题想出了上面的那个‘7-[iDate+7-(iDay+1)]%7’公式。
莫要嘲笑我呀。。。不知读者有什么更好的方法吗,求大神带。。
再之后就是代入到面板里了:
for (var i = 0; i1;
}; //按星期排列出本月日历
之后就想办法罗列上月和下月的日期:
var iDaysUp=calendarArr(time.getFullYear(),time.getMonth());
var iDaysDown=calendarArr(time.getFullYear(),time.getMonth()+2);
//获取这两月的天数
for (var i = temp-1; i>=0; i--) {
oTd[i].innerHTML=iDaysUp;
iDaysUp--;
oTd.eq(i).addClass('normal');
};//列出上个月在本日历中的星期排列;
var iNow=1;
for (var i = temp+iDays; i<=oTd.length-1; i++) {
oTd[i].innerHTML=(iNow);
iNow++;
oTd.eq(i).addClass('normal');
};//列出下个月。。。。。
最后呢,终于把这个功能实现了,真是不容易呢。。。
(function(){
var oTd=[];
var oDiv=$('#calender');
var oTd=oDiv.find('td');
var time=new Date();
var iDays=calendarArr(time.getFullYear(),time.getMonth()+1);//获取本月总天数
var iDaysUp=calendarArr(time.getFullYear(),time.getMonth());
var iDaysDown=calendarArr(time.getFullYear(),time.getMonth()+2);
var iDate=time.getDate();//console.log(iDate);
var iDay=time.getDay();//console.log(iDay)
calender();
function calender(){
var temp=7-[iDate+7-(iDay+1)]%7;//console.log(temp);//求出本月一号所对应的星期数。
for (var i = 0; i
oTd[i+temp].innerHTML=i+1;
}; //按星期排列出本月日历
for (var i = temp-1; i>=0; i--) {
oTd[i].innerHTML=iDaysUp;
iDaysUp--;
oTd.eq(i).addClass('normal');
};//列出上个月在本日历中的星期排列;
var iNow=1;
for (var i = temp+iDays; i<=oTd.length-1; i++) {
oTd[i].innerHTML=(iNow);
iNow++;
oTd.eq(i).addClass('normal');
};
}
function calendarArr(year,month){
var leap;
var monthMax;
var monthsArr=['1','3','5','7','8','10','12'];
if (year%4==0) {if(year%100==0) {if (year%400==0) {leap=true;}else{leap=false;};}else{leap=true;};}else{leap=false;};
if (month==2) {
if (leap){monthMax=29;}else{monthMax=28;}
} else{
for (var i = 0; i < monthsArr.length; i++) { if(month==monthsArr[i]){monthMax=31;break;}else{monthMax=30;} }; } return monthMax; }; })();
html部分:
<div id="calender">
<ul class="gradient">
<li>SUNli>
<li>MONli>
<li>TUEli>
<li>WEDli>
<li>THUli>
<li>FRIli>
<li>SURli>
ul>
<table>
<tr>
<td>td>
<td>td>
<td>td>
<td>td>
<td>td>
<td>td>
<td>td>
tr>
<tr>
<td>td>
<td>td>
<td>td>
<td>td>
<td>td>
<td>td>
<td>td>
tr>
<tr>
<td>td>
<td>td>
<td>td>
<td>td>
<td>td>
<td>td>
<td>td>
tr>
<tr>
<td>td>
<td>td>
<td>td>
<td>td>
<td>td>
<td>td>
<td>td>
tr>
<tr>
<td>td>
<td>td>
<td id="ddd">
td>
<td>td>
<td>td>
<td>td>
<td>td>
tr>
<tr>
<td>td>
<td>td>
<td>td>
<td>td>
<td>td>
<td>td>
<td>td>
tr>
table>
div>
css:
#calender {border: 1px solid #8291B0 ;overflow: hidden;}
#calender ul{width: 318px;height:38px; overflow: hidden;}
#calender li{float:left;font-size: 14px;font-family: arial;}
#calender li,#calender td{width: 44px;text-align: center;line-height: 34px;height: 34px;font-weight: bold;color: #666;}
#calender td{background: #F1F1F1;border: 4px solid #FFF;}
#calender .active{}
#calender .normal{background-color: #F9F9F9;color: #999;}