2012-08-15 83 views
0

我正在嘗試創建一個下拉日曆。沒有jquery!純JavaScript。到目前爲止,@rlemon已經爲我提供了很大的幫助,並且我已經能夠構建出他幫助過我的代碼。我差不多完成了,但遇到一些小問題。到目前爲止,一切工作都正常,但現在我正在將閏年納入其中,這是我遇到問題的地方。我無法確定所選的當年。我有Javascript下拉功能

sel_year.onchange = recalculateDays2(this); 

我相信是通過當年選定的價值。然後在功能recalculateDays2我創建一個變量

year_index = x.text; 

這應該是這樣的year_index = 2011,2012等。我想要的功能recalculateDays2至二月天設定爲29,當用戶已經改變爲一年2012年請幫助...

<html> 
<head> 
</head> 
<body> 
Calendar<br> 
<hr align="left" width="200px"/> 
--Year ------ Month ----- Day<br> 
<div id="calendar-container"></div> 
<script type="text/javascript"> 
(function() { 
    var yr1 = 2011, yr2 = 2012, yr3 = 2013, yr4 = 2014; 
    var years = [yr1, yr2, yr3, yr4]; 
    var calendar = [ 
     ["January", 31],["February", 28],["March", 31],["April", 30],["May", 31],["June", 30],["July", 31],["August", 31],["September", 30],["October", 31],["November", 30],["December", 31]], 
     //this is the variable that accesses the content 
     cont = document.getElementById('calendar-container'); 
    //creates the variables for the drop downs 
    var sel_year = document.createElement('select'), sel_month = document.createElement('select'), sel_day = document.createElement('select'); 

    function createOption(txt, val) { 
     //this creates the option but it seems that it is making the value -1 than what the text node is 
     var option = document.createElement('option'); 
     option.value = val; 
     option.appendChild(document.createTextNode(txt)); 
     return option; 
    } 

    function createYearOption(val) { 
     var option = document.createElement('option'); 
     option.value = val; 
     option.appendChild(document.createTextNode(val)); 
     return option; 
    } 

    //this clears any elements for days, months, years 
    function clearChildren(ele) { 
     while (ele.hasChildNodes()) { 
      ele.removeChild(ele.lastChild); 
     } 
    } 

    //this function is only triggered when you recalculate the months 
    function recalculateDays() { 
     var month_index = sel_month.value, 
      df = document.createDocumentFragment(); 
     //l is the variable for the number of days in the month from the array above ex:28, 30, 31 
     for (var i = 0, l = calendar[month_index][1]; i < l; i++) { 
      //the first variable is what number will be displayed in the day drop down 
      df.appendChild(createOption(i + 1, i)); 
     } 
     clearChildren(sel_day); 
     sel_day.appendChild(df); 
    } 

    //this function is triggered only when you change the year 
    function recalculateDays2(x) { 
     var month_index = sel_month.value, 
      df = document.createDocumentFragment(), 
      year_index = x.text; 
     //this checks to see if the month selected is Feb 
     if ((month_index == 1) && (year_index == 2012)) { 
     //l is the variable for the number of days in the month from the array above ex:28, 30, 31 
     for (var i = 0, l = calendar[month_index][1]; i < l + 1; i++) { 
      //the first variable is what number will be displayed in the day drop down 
      df.appendChild(createOption(i + 1, i)); 
     } 
     clearChildren(sel_day); 
     sel_day.appendChild(df); 
    } else {}} 

    function generateMonths() { 
     var df = document.createDocumentFragment(); 
     calendar.forEach(function(info, i) { 
      df.appendChild(createOption(info[0], i)); 
     }); 
     //clears past months 
     clearChildren(sel_month); 
     //appends new months onto variable df 
     sel_month.appendChild(df); 
    } 

    function generateYears() { 
     var df = document.createDocumentFragment(); 
     years.forEach(function(i) { 
      df.appendChild(createYearOption(i)); 
     }); 
     //clears past months 
     clearChildren(sel_year); 
     //appends new months onto variable df 
     sel_year.appendChild(df); 
    } 

    //anytime the month selector is changed this calls the function to change the days 
    sel_month.onchange = recalculateDays; 
    sel_year.onchange = recalculateDays2(this); 

    //i believe this automatically runs the months and days functions specifically for when first loading the page 
    generateMonths(); 
    recalculateDays(); 
    generateYears(); 

    //this is what displays each of the individual drop downs after everything has been done to them 
    cont.appendChild(sel_year); 
    cont.appendChild(sel_month); 
    cont.appendChild(sel_day); 
}()); 
</script> 
</body> 
</html> 

回答

1

一個簡單的方法來檢查,如果今年是閏年將原型到你的代碼是:

Date.prototype.isLeapYear = function() { 
    return (new Date(this.getFullYear(),1,29).getMonth() == 1); 
}; 

然後,你可以updat e在2月份適當的天數。