2011-02-11 101 views
1

以下代碼根據表單中選定的月份驗證月份的天數。月份值從1月到12月,從1日到31日和從1900年到2010年。我試圖做一個非常小的變化,我想在三個下拉框中的每一個添加第一個選項,一個空白選擇選項或例如破折號。因此月份下降的第一個選項是 - 而不是1月。爲此,我在每個下拉列表中添加以下行。javascript請求小幫助

<option value=""> - </option> 

但是,通過添加它,它不會正確顯示一月和二月的天數(它顯示比它應該少一天)。這是一些JavaScript問題,但我不明白什麼是錯的。如果你能幫助我,我將非常感激。 下面是HTML,Javascript和PHP填充表單的完整代碼。

<?php 
$monthOptions = ''; 
$dayOptions = ''; 
$yearOptions = ''; 
for($month=1; $month<=12; $month++){ 
    $monthName = date("M", mktime(0, 0, 0, $month)); 
    $monthOptions .= "<option value=\"{$month}\">{$monthName}</option>\n"; 
} for($day=1; $day<=31; $day++){ 
    $dayOptions .= "<option value=\"{$day}\">{$day}</option>\n"; 
} for($year=1900; $year<=2010; $year++){ 
    $yearOptions .= "<option value=\"{$year}\">{$year}</option>\n"; 
} 
?> 
<html> 
<head> 
<script type="text/javascript"> 

function updateDays() 
{ 
    //Create variables needed 
    var monthSel = document.getElementById('month'); 
    var daySel = document.getElementById('day'); 
    var yearSel = document.getElementById('year'); 
    var monthVal = monthSel.value; 
    var yearVal = yearSel.value; 

    //Determine the number of days in the month/year 
    var daysInMonth = 31; 
    if (monthVal==2){ 
     daysInMonth = (yearVal%4==0 && (yearVal%100!=0 || yearVal%400==0)) ? 29 : 28; 
    } else if (monthVal==4 || monthVal==6 || monthVal==9 || monthVal==11) { 
     daysInMonth = 30; 
    } 
    //Add/remove options from days select list as needed 
    if(daySel.options.length > daysInMonth){ //Remove excess days, if needed 
     daySel.options.length = daysInMonth; 
    } while (daySel.options.length != daysInMonth){ //Add additional days, if needed 
     daySel.options[daySel.length] = new Option(daySel.length+1, daySel.length+1, false); 
    } 
    return; 
} 

</script> 
</head> 
<body> 
Birthdate:<br /> 
<select name="month" id="month" onchange="updateDays();"> 
<?php echo $monthOptions; ?> 
</select> 

<select name="day" id="day"> 
<?php echo $dayOptions; ?> 
</select> 

<select name="year" id="year" onchange="updateDays();"> 
<?php echo $yearOptions; ?> 
</select> 

</body> 
</html> 

感謝您的任何幫助。

回答

1

爲什麼不使用OPTGROUP代替:

<optgroup label="-"> ... </optgroup>

順便說一句,好聽的名字!

0

不要重新發明輪子,請使用內置的Date對象來檢查日期。

function daysInMonth(year, month) { 
    return (new Date(year, month, 0)).getDate(); 
} 

也有在你的代碼中的錯誤:「{」就在評論之前「刪除多餘的天,如果需要的話」是不必要的。