日期:2014-05-17  浏览次数:20448 次

两种不同的按钮,如何做事件代理?
本帖最后由 xq870723 于 2013-09-17 17:30:58 编辑
各位,中秋快乐。

有个问题困扰我多时,还请大家不吝赐教。
有两个按钮,一个是服务器控件btn1,一个是静态控件btn2(其实我也不知这个该叫啥,反正不在服务器端执行,具体叫啥还请各位指正)

<asp:Button ID="btn1" runat="server" Text="btn1" OnClick="Btn1_Click" OnClientClick="return Validate();" />

 <input type="button" value="btn2" onclick="$('#<%= btn1.ClientID %>').click();" />

问题来了,当function Validate()返回的是false,点击btn1没反应,但是此时点击btn2时却提交了,会执行btn1的OnClick。这为啥嗯,如果btn1没有OnClick,那么点击两个按钮都会执行btn1的OnClientClick。也就是说,onclick="$('#<%= btn1.ClientID %>').click();" 这种事件代理的写法是可行的,可是返回false后却还执行了btn1的Onclick。

------解决方案--------------------
看看最终生成的html代码
------解决方案--------------------
使用$(('#<%= btn1.ClientID %>').trigger("click")试试
------解决方案--------------------
如果你是说的这种情况你可以
<input type="button" value="btn2" onclick="if(Validate()) $('#<%= btn1.ClientID %>').click();" />

------解决方案--------------------
嗯,又看了一下,我给看成是 submit 了。

如果你确定点击 bt2 时 Validate() 返回的也是false,那么真的就很奇怪了。你还是调试一下此时是否是 false 吧。
------解决方案--------------------
1. 复制多一个服务器控件,只是改下ID,S端事件和C端事件和第一个一样;
2. return之前先判断。
------解决方案--------------------
如果用的JQ

试试在script标签里注册click事件

或者

如果 Validate()是在  $(document).ready();内的 把它移到外面去看看

------解决方案--------------------
引用:
Quote: 引用:

1. 复制多一个服务器控件,只是改下ID,S端事件和C端事件和第一个一样;
2. return之前先判断。


复制多一个服务器控件会不会开销太大?


的确,这一招比第二种差,对用户来说,他体验不到差异,但多人登录时对服务器的影响就大些了,具体多大我也不知。