用javascript创建一个本地变量来跟踪日历上的月份

Creating a local variable to keep track of months on a calendar in javascript.

本文关键字:跟踪 变量 日历 创建 javascript 一个      更新时间:2023-09-26

下面有一个完整的日历创建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变量设置为1nextMonth()函数本地的完全不同的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