我在select
中有3个form
个输入,表示日期。一个是白天,一个是月,一个是年。
使用javascript添加这些选项的选项:例如,如果选择的年份可以除以4而月份是2月那么那天将有29天selecet
否则会有只有28.-这是有效的,我不知道它是否与问题有关所以无论如何我带来了它。
现在,如果您想输入一个以年份和月份开头的日期,那么代码将知道要添加到当天select
的天数。
因此我在此使用了asp.net
,并且每当在月份和年份之前选择selecet
时,会有一个<td id="dateE">
变为可见且在其中写入第一个月和一年。
问题它不起作用 - 当您在年份select
之前点击select
时没有任何反应 - 没有错误,网站没有失败或任何事情。
此选项包含runat=server
和autopostback=true
,我尝试onclick
onserverclick
onfocus
, <body onload ="addDate()">
<form id="form1" runat="server">
<table>
<tr><td>
Birth Date:
<br />
<select id="Day" name="Day" class="regis" style="width:109px" onfocus="Day_Click" runat="server" autopostback="true">
<option value="" selected="selected">Day</option>
</select>
/
<select id="Month" name="Month" class="regis" onchange="updateDay()" style="width:109px">
<option value="" selected="selected">Month</option>
</select>
/
<select id="Year" name="Year" class="regis" onchange="yearChanged()" style="width:109px">
<option value="" selected="selected" >Year</option>
</select>
</td>
<td class="un" id="dateE" runat="server"></td>
</tr>
</table>
</form>
</body>
无效。
这里是代码:
HTML:
.un
{
display:none;
}
.feedback
{
border-top:1px solid black;
border-left:1px solid black;
vertical-align:bottom;
}
.regis
{
border: 1px solid rgba(190, 190, 190, 0.9);
background-color: #fff;
background: transparent;
height:25px;
}
的CSS:
function addYear() {
var currentYear = new Date().getFullYear();
var legalWorkingAge = currentYear - 16;
var select = document.getElementById("Year");
for (var i = legalWorkingAge; i >= 1900; i--) {
var option = document.createElement('option');
option.text = option.value = i;
select.add(option, 0);
} //for
} //addYear
function addMonth() {
var select = document.getElementById("Month");
for (var i = 1; i <= 12; i++) {
var option = document.createElement('option');
option.text = option.value = i;
select.add(option, 0);
} //for
} //addMonth
function addDay(month) {
var select = document.getElementById("Day");
while (select.options.length != 1) {
select.options.remove(1);
}
var daynum;
switch (parseInt(month)) {
case 1: daynum = 31;
break;
case 2:
var year = document.getElementById("Year");
var selectedYear = year.options[year.selectedIndex].value;
if (parseInt(selectedYear) % 4 == 0)
daynum = 29;
else
daynum = 28;
break;
case 3: daynum = 31;
break;
case 4: daynum = 30;
break;
case 5: daynum = 31;
break;
case 6: daynum = 30;
break;
case 7: daynum = 31;
break;
case 8: daynum = 31;
break;
case 9: daynum = 30;
break;
case 10: daynum = 31;
break;
case 11: daynum = 30;
break;
case 12: daynum = 31;
break;
} //switch
for (var i = 1; i <= daynum; i++) {
var option = document.createElement('option');
option.text = option.value = i;
select.add(option, 0);
} //for
} //addDay
function addDate() {
addMonth();
addYear();
} //addDate
function updateDay() {
var month = document.getElementById("Month");
var selectedMonth = month.options[month.selectedIndex].value;
addDay(selectedMonth);
}
function yearChanged() {
var month = document.getElementById("Month");
var selectedMonth = month.options[month.selectedIndex].value;
if (selectedMonth != "")
updateDay()
}
的javascript:
public void Day_Click(object sender, EventArgs e)
{
this.dateE.InnerText = "Enter a Month and a Year First";
this.dateE.Attributes.Add("class", "feedback");
}
asp.net:
{{1}}
它让我变得愚蠢,我已经看了很多次问题,而我却找不到它。
感谢您的帮助
答案 0 :(得分:1)
您正在使用来自HtmlControls
命名空间的控件 - 这使得所有内容变得复杂。
首先,对于这些控件,您可能使用的大多数事件(如onclick
,onfocus
等)都是客户端的常规HTML标记。因此,它们甚至不会触发回发到服务器,更不用说验证和服务器端事件处理程序了。
不同的HtmlControl
个继承者定义了不同的服务器端事件,以便至少可以与服务器进行一些交互。其中一些根本没有任何内容,但您使用的select
已定义OnServerChange。这是唯一可用于在服务器上跟踪控件发生的事情。
当然,您仍然可以使用类似onfocus
或onclick
的客户端,但这意味着编写手动触发回发的客户端处理程序。可能,但有点棘手。
另一个需要考虑的好选择是使用asp:DropDownList
控件,该控件呈现为select
,但在服务器上使用会更方便。
最后,您尝试做的事情似乎更适合完全客户端解决方案。那就是你应该能够通过javascript轻松控制对选择的可见性/访问。你有没有考虑过这种方法?