触发JQuery事件后不会触发Codebehind OnClick事件

时间:2014-07-26 21:08:43

标签: javascript jquery asp.net html5 validation

我在表单的几个字段上使用html5约束验证,例如:

<asp:TextBox ID="TextBox1" runat="server" Required="required" ToolTip="Description is required."></asp:TextBox>
<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" />

我想在点击时通过CSS和JQuery禁用提交按钮,但仅在验证通过后。我试图像这样挂钩表单提交事件:

<script type='text/javascript'>
var $form = $('#form1');
var $submitButton = $('#<% = btnSubmit.ClientID %>');

$form.submit(function () {
$submitButton.prop('disabled', true);
})
</script>

验证后成功禁用按钮,会调用回发,但我的btnSubmit_click事件未被触发。

当html5约束验证通过时,我如何通过javacript / jquery确定所以我可以执行一个禁用按钮的jquery函数,但仍允许我的btnSubmit_click事件触发?

更新 我使用普通的JQuery 2.0.3

1 个答案:

答案 0 :(得分:1)

在某些情况下,同时触发Codebehind事件和JQuery事件是一个常见问题。你可以使用一些技巧来克服这个问题,但我使用这个作为一个肮脏的解决方案,也许有一些更清洁的方法。

你可以让JQuery form.submit事件在第一次正常启动,但是当你点击Submit Button时,在按钮上添加一个“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>

在CodeBehind中:

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中。 如您所知,在每次回发后,当显示OK消息时,JQuery应用的更改将消失,按钮将再次设置为enable。 如果你想永久地将按钮设置为禁用,你可以改变后面的代码:

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中使用,也没有任何问题。