下面有一个完整的日历创建html页面,复制它看看它能做什么。我下面有两个按钮,可以按月递增。我的问题是,因为我可以在页面顶部实例化var month= date.getMonth()
,全局变量month
只允许我递增和递减1,我怎么能让month
设置为局部变量,这样我就可以递增到1以上。这是代码:我相信复制粘贴会起作用:
下面我发布了我的按钮处理程序,以增加月份/减少月份。
<script type="text/javascript">
printCalendar(year,month,divDestination);
function printCalendar(year,mth,divDestination){
var currentmonth = mth;
var myOutput=document.getElementById(divDestination)
myOutput.innerHTML=makeCalendar(year,mth)
}
function prevMonth(m){
m--;
var currentmonth = m;
alert(m);
if(m < 0)
{
m = 11;
year--;
}
printCalendar(year,currentmonth,divDestination);
}
function nextMonth(m){
m++;
var currentmonth = m;
if(m > 11)
{
m=0;
year++;
}
printCalendar(year,currentmonth,divDestination);
}
function test(div){
var myOutput=document.getElementById("divCalendar")
myOutput.innerHTML += eventmonth;
}
</script>
<div align="center" id="divCalendar"></div>
<div align="center" id="myButtons">
<input type="button" onclick="test('divCalendar')" value="Say hi" />
<input type="button" onclick="prevMonth(month,'divCalendar')" value="Previous"/>
<input type="button" onclick="nextMonth(month,'divCalendar')" value="Next" />
<input type="button" onclick="printCalendar(year,month,'divCalendar')" value="Reload Calendar" />
下面是我的makeCalendar功能
var myDate = new Date();
var month = myDate.getMonth();
var year = myDate.getFullYear();
var divDestination="divCalendar";
function leapYear(yr) {
if (yr < 1000) yr+=1900
return((yr%4 == 0) && ((yr%100 == 0) || (yr%400 ==0)))
}
function startCol(width, height, color){
return('<TD WIDTH=' + width + ' HEIGHT=' + height + '>' + '<FONT COLOR="' + color + '">');
}
function getHoliday(monthSelected,theday)
{
monthSelected = monthSelected + 1
var holiday = ""
var HolidayName = new Array (1, 1, "New Year's Day",7, 1, "Canada Day",12, 25, "Christmas Day",12, 26, "Boxing Day", 2,14,"Valentine's Day")
for(var index = 0; HolidayName.length >= index; index++)
{
if(HolidayName[index] == monthSelected && HolidayName[index+1] == theday)
{
holiday = HolidayName[index+2]
}
}
return holiday
}
function makeCalendar(yr, mth)
{
var monthSelected = mth
var months = new Array("Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec")
var days = new Array(31, leapYear(yr)?29:28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
var weekDays = new Array("Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat")
var mthSz = days[mth]
var mthName = months[mth]
var firstDyofMnth = new Date(yr, mth, 1)
var firstDay = firstDyofMnth.getDay() + 1
var numRows = Math.ceil((mthSz + firstDay-1)/7)
var mthNameHeight = 50
var borderWidth = 2
var cellSpacing = 4
var cellHeight = 80
var hdrColor = "midnightblue"
var hdrSz = "+3"
var colWidth = 100
var dayCellHeight = 25
var dayColor = "black"
var dayCtr = 1
// Build the HTML Table
var txt = '<CENTER>'
txt += '<TABLE BORDER=' + borderWidth + ' CELLSPACING=' + cellSpacing + '>'
//Show Month Name and Year
txt += '<TH COLSPAN=7 HEIGHT=' + mthNameHeight + '>'
txt += '<FONT COLOR="' + hdrColor + '" SIZE=' + hdrSz + '>'
txt += mthName + ' ' + year + '</FONT>' + '</TH>'
// Show Days of the Week
txt += '<TR ALIGN="center" VALIGN="center">'
for (var dy = 0; dy < 7; ++dy) {
txt += startCol(colWidth, dayCellHeight, dayColor) + weekDays[dy] + '</FONT></TD>'
}
txt += '</TR>'
// Show Dates in Calendar
for (var row=1; row <= numRows; ++row)
{
txt += '<TR ALIGN="right" VALIGN="top">'
for (var col = 1; col <= 7; ++col)
{
if (((col < firstDay) && (row==1)) || (dayCtr>mthSz))
{txt += '<TD BGCOLOR="Gainsboro"><BR></TD>'}
else
{
var event = getHoliday(monthSelected, dayCtr)
txt += '<TD HEIGHT=' + cellHeight + '><FONT COLOR="' + dayColor + '"> <B>'
txt += dayCtr
txt += '</B></FONT><BR>' + event + '</TD>'
dayCtr++;
}
}
txt += '</TR>'
}
// close all basic table tags and output txt string
txt += '</TABLE></CENTER>'
return txt
}
让我们试着把它进一步削减到钱的部分。这基本上就是你正在做的事情。
var month = new Date().getMonth()
var nextMonth = function(m) {
m++;
setMonthSomewhere(m);
};
nextMonth(month);
因此,所发生的事情是将全局传递给nextMonth()
函数,该全局在任何地方都可以访问。函数参数基本上声明一个局部变量,该变量设置为传入的值。现在,全局month
变量设置为1
,nextMonth()
函数本地的完全不同的m
也设置为1
。然后将局部变量m
递增到2
,这对全局变量没有影响。
相反,不要传递它。直接操纵全局。
var month = new Date().getMonth()
var nextMonth = function() {
month++;
setMonthSomewhere(month);
};
nextMonth();
现在nextMonth()
直接递增全局month
变量,更改其值。
您在处理程序<input type="button" onclick="nextMonth(month,'divCalendar')" value="Next" />
中使用全局变量month
,但从未更新该全局变量。
为什么不尝试从nextMonth函数中删除第一个参数,而不是使用m
来使用month呢。
function nextMonth(){
month++;
if(month > 11)
{
month=0;
year++;
}
printCalendar(year,month,divDestination);
}
(注意,你对"currentMonth"变量的使用可能也是错误的,所以我删除了它)
但我认为你的设计有点缺陷——因为你使用全局变量并将它们放在全局命名空间中,如果你需要渲染2个日历,或者其他javascript想要使用变量名"month"或"year",你会遇到困难。
EDIT(添加更好的解决方案)
不过,我建议您不要向函数传递数字,而是传递一个完整的日期对象,因为这会使代码简单得多。
function printCalendar(date, divDestination) {
var myOutput=document.getElementById(divDestination)
myOutput.innerHTML=makeCalendar(date.getFullYear(), date.getMonth());
}
function nextMonth(date, divDestination) {
date.setMonth(date.getMonth()+1);
printCalendar(date, divDestination);
}
function prevMonth(date, divDestination) {
date.setMonth(date.getMonth()-1);
printCalendar(date, divDestination);
}
现在,因为您传递了一个Date对象,nextMonth和prevMonth函数实际上会修改该对象,因此下次调用Date时将使用新的月份进行更新。
这里有一个小提琴,展示了使用日期对象的解决方案
Fiddle