谁知道为什么asp:CheckBox的客户端javascript处理程序需要是一个OnClick="“属性,而不是asp:Button的OnClientClick="”属性?
例如,这是可行的:
<asp:CheckBox runat="server" OnClick="alert(this.checked);" />
而这不是(没有错误):
<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />
但这是可行的:
<asp:Button runat="server" OnClientClick="alert('Hi');" />
而这不是(编译时错误):
<asp:Button runat="server" OnClick="alert('hi');" />
(我知道Button.OnClick是用来干什么的;我想知道为什么CheckBox不能以同样的方式工作……)
发布于 2009-07-16 02:35:03
这太奇怪了。我检查了CheckBox documentation page,上面写着
<asp:CheckBox id="CheckBox1"
AutoPostBack="True|False"
Text="Label"
TextAlign="Right|Left"
Checked="True|False"
OnCheckedChanged="OnCheckedChangedMethod"
runat="server"/>
正如您所看到的,没有定义OnClick或OnClientClick属性。
记住这一点,我认为这就是正在发生的事情。
当你这样做的时候,
<asp:CheckBox runat="server" OnClick="alert(this.checked);" />
ASP.NET不修改OnClick属性,而是在浏览器上按原样呈现它。它将呈现为:
<input type="checkbox" OnClick="alert(this.checked);" />
显然,浏览器可以理解“OnClick”并发出警告。
在这个场景中
<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />
同样,ASP.NET不会更改OnClientClick属性,而是将其呈现为
<input type="checkbox" OnClientClick="alert(this.checked);" />
因为浏览器不会理解OnClientClick,所以什么都不会发生。它也不会引发任何错误,因为它只是另一个属性。
您可以通过查看呈现的HTML来确认上面的内容。
是的,这一点都不直观。
发布于 2009-07-16 02:39:39
因为它们是两种不同的控件。
你看,你的浏览器不知道服务器端编程。它只知道它自己的DOM和它使用的事件模型...并且用于呈现给它的对象的点击事件。您应该检查从ASP.Net实际发送到浏览器的最终标记,以了解您自己的差异。
<asp:CheckBox runat="server" OnClick="alert(this.checked);" />
渲染到
<input type="check" OnClick="alert(this.checked);" />
和
<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />
渲染到
<input type="check" OnClientClick="alert(this.checked);" />
现在,据我所知,在任何地方都没有浏览器在其DOM中支持"OnClientClick“事件……
如果有疑问,请始终在输出发送到浏览器时查看输出的源...你可以看到整个调试信息的世界。
发布于 2009-07-16 02:34:12
你说得对,这是不一致的。实际情况是,CheckBox没有服务器端的OnClick事件,因此您的标记将呈现给浏览器。http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.checkbox_events.aspx
而Button确实有一个OnClick -所以ASP.NET希望在你的OnClick标记中引用一个事件。
https://stackoverflow.com/questions/1135134
复制相似问题