javascript - 触发 JQuery 事件后不会触发代码隐藏 OnClick 事件

标签 javascript jquery asp.net html 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 在单击时禁用提交按钮,但只有在验证通过之后。我尝试像这样 Hook 表单提交事件:

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

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

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

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

更新: 我正在使用普通的 JQuery 2.0.3

最佳答案

在某些情况下,同时触发 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秒后,lblMsg中将显示“OK”消息。 如您所知,每次回发后,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 中使用,没有任何问题。

关于javascript - 触发 JQuery 事件后不会触发代码隐藏 OnClick 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24975565/

相关文章:

javascript - 使用 JavaScript 隐藏最后一个 DIV?

JavaScript 无法获取ElementById

jQuery Mobile Taphold

c# - ASP.NET 中 AjaxMin 5.14 和 Report Viewer 的问题

c# - 使用 ValidationProperty 属性防止 UserControl 的完整回发

javascript - Angular JS $http 与 SharePoint Rest 解析响应

javascript - 如果打开压缩,JavaScript 缩小有什么意义吗?

javascript - 关于按键 = 在文本字段中输入

javascript - 防止 html 页面在页面加载时自动滚动到小部件

asp.net - 防止在 ASP.Net 中重新提交表单(不重定向到我自己)