2012-08-15 4 views
0

J'essaie de créer un calendrier déroulant. Pas de jquery! Javascript pur. Jusqu'à présent @rlemon m'a fourni une aide précieuse et j'ai pu construire du code avec lequel il m'a aidé. J'ai presque fini, mais j'ai quelques petits problèmes. Jusqu'à présent, tout fonctionne correctement, mais maintenant je passe à l'incorporation des années bissextiles qui est où j'ai des problèmes. J'ai du mal à déterminer l'année en cours qui est sélectionnée. J'aiJavascript Drop Down Fonction

sel_year.onchange = recalculateDays2(this); 

qui, je crois, transmet la valeur de l'année en cours sélectionnée. Puis, dans la fonction recalculateDays2 Je crée une variable

year_index = x.text; 

qui est censé être quelque chose comme year_index = 2011, 2012 etc. Je veux que la fonction recalculateDays2 régler les jours feb 29 lorsque l'utilisateur a changé à l'année 2012. S'il vous plaît aider ...

<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> 

Répondre

1

un moyen facile de vérifier si une année est une année bissextile serait de prototype ceci dans votre code:

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

Ensuite, vous pouvez updat e votre tableau avec le nombre de jours en Février.