asp.net textbox的ontextchange事件不能触发
<asp:TextBox ID="time" runat="server" Onclick="new CbsCalendar(this.id)"Width ="88%" AutoPostBack="true" ontextchanged="time_TextChanged" ></asp:TextBox>
onclick事件是显示一个日历,然后textbox中日期变更以后不会触发time_textchanged事件
onclick事件是显示一个日历,然后textbox中日期变更以后不会触发time_textchanged事件
答案:TextBox控件会被Render成 html 中的 inpu type="text" 控件, 其 AutoPostBack 是通过 input 的DOM事件 onchange 来实现的。以下是 .net 3.5 中 TextBox 生成的 html:<input name="TextBox1" type="text" onchange="javascript:setTimeout('__doPostBack(\'TextBox1\',\'\')', 0)" onkeypress="if (WebForm_TextBoxKeyHandler(event) == false) return false;" id="TextBox1" />
而客户端事件 onchange 只在手动修改文本框的值后才会触发,用脚本修改值并不触发该事件。而你用的日历控件恰恰是通过 javascript 脚本来给文件框设置值的,所以不会有 onchange 事件触发,也就不会回发页面。 变通的实现方法是在日历控件的脚本中设置完文本框的值后调用下文本框的onchange,简单的可以通过 document.getElementById(textbox_id).onchange(); 实现, textbox_id即你传给 new CbsCalendar() 的参数也就是文本框的客户端id。
ontextchanged要在textbox处于焦点状态后改变其内容在失去焦点才调用。
回到你的情况中:电击文本框(或取得焦点)---弹出日历并选择日期(此时焦点移chu文本框,但文本框内容未发生变化)---通过js改变文本框的内容(值为:选择的日期)应该是焦点不在文本框上,在日历控件上就算是值改变了也激发不了ontextchanged事件,这个事比较麻烦,我现在也想不到解决方法,只能说一下我的想法,这也算一个bug,以前也遇到过不过忘记是怎么做的用ajax控件来控制
干嘛非要ontextchanged事件啊,
这个事件对事件触发条件界定不准,所以有时候产生 不响应
你试试别的事件,如onkeypress,onblur
目的不就是要让他改变的时候触发事件么?
Html前台代码:
<body>
<form id= "form1 " runat= "server ">
<div>
<table cellpadding= "0 " cellspacing= "0 " border= "0 ">
<tr>
<td>
<asp:TextBox ID= "txtOnkeyup " runat= "server " ToolTip= "您输入的信息可在下面马上显示出来! " onkeyup= "updatelabel(); "> </asp:TextBox>
</td>
</tr>
</table>
</div>
<div>
<asp:Label ID= "lblOnkeyup " runat= "server " Text= " "> </asp:Label>
</div>
</form>
<script language= "javascript " type= "text/javascript ">
//输入马上打印在页面上的JS代码
function updatelabel()
{
t1=document.getElementById( "txtOnkeyup ");
d1=document.getElementById( "lblOnkeyup ");
d1.innerHTML=t1.value;
}
</script>
</body>
后台C#代码:
protected void Page_Load(object sender, EventArgs e)
{
txtOnkeyup.Attributes.Add( "onkeyup ", "updatelabel() ");
}