在某些情况下同时触发 Codebehind 事件和 JQuery 事件是一个常见问题。您可以使用一些技巧来克服这个问题,但我将这个用作肮脏的解决方案,也许还有一些更清洁的方法。
您可以让 JQuery form.submit 事件在第一次正常触发,但是当您单击提交按钮时,将“DontFireJQuery”类添加到按钮并在将按钮设置为禁用后,它会再次自动触发:
__doPostBack("<%= btnSubmit.UniqueID %>", "");
在下一次触发中,按钮具有“DontFireJQuery”类,JQuery 跳过它,因此触发 Codebehind OnClick 事件。
<asp:TextBox ID="TextBox1" runat="server" Required="required" ToolTip="Description is required."></asp:TextBox>
<br />
<asp:Button ID="btnSubmit" runat="server" Text="Submit" />
<br />
<asp:Label ID="lblMsg" runat="server" Text=""></asp:Label>
<script type='text/javascript'>
Sys.Application.add_load(initJScripts);
function initJScripts() {
var $form = $('#form1');
var $submitButton = $('#<% = btnSubmit.ClientID %>');
if (!$submitButton.hasClass("DontFireJQuery")) {
$form.submit(function () {
$submitButton.addClass("DontFireJQuery");
$submitButton.prop('disabled', true);
__doPostBack("<%= btnSubmit.UniqueID %>", "");
})
}
}
</script>
在代码隐藏中:
Private Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click
System.Threading.Thread.Sleep(1000)
lblMsg.Text = "OK"
End Sub
(如果需要,您可以使用此在线工具将 VB 转换为 C#:http://codeconverter.sharpdevelop.net/SnippetConverter.aspx)
这一行:
System.Threading.Thread.Sleep(1000)
用于测试,为了显示按钮被设置为立即禁用,1 秒后,“OK”消息将显示在 lblMsg 中。
如您所知,在每次回发后,JQuery 应用的更改将消失,并且在显示 OK 消息时按钮再次设置为启用。
如果您想将按钮设置为永久禁用,您可以像这样更改后面的代码:
Private Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click
System.Threading.Thread.Sleep(1000)
btnSubmit.Enabled = False
lblMsg.Text = "OK"
End Sub
这段代码的编写方式也可以毫无问题地在 UpdatePanel 中使用。