当我禁用提交按钮以防止双击时,为什么我的表单没有发布?

Joh*_*yre 8 javascript asp.net client-side double-submit-prevention

像地球上的其他每个Web开发人员一样,用户双击表单上的提交按钮时遇到问题.我的理解是,处理这个问题的传统方法是在第一次点击后立即禁用按钮,但是当我这样做时,它不会发布.

我对此做了一些研究,上帝知道有足够的信息,但其他问题,如表单提交上的禁用按钮,禁用按钮似乎工作.提交后禁用按钮的原始海报似乎与我有同样的问题,但没有提及如何/如果他解决它.

这里有一些关于如何重复它的代码(在IE8 Beta2中测试,但在IE7中有同样的问题)

我的aspx代码

<%@ Page Language="C#" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<script language="javascript" type="text/javascript">
    function btn_onClick()
    {
        var chk = document.getElementById("chk");
        if(chk.checked)
        {
            var btn = document.getElementById("btn");
            btn.disabled = true;
        }
    }
</script>
<body>
    <form id="form1" runat="server">
        <asp:Literal ID="lit" Text="--:--:--" runat="server" />
        <br />
        <asp:Button ID="btn" Text="Submit" runat="server" />
        <br />
        <input type="checkbox" id="chk" />Disable button on first click
    </form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我的cs代码

using System;

public partial class _Default : System.Web.UI.Page 
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        btn.Click += new EventHandler(btn_Click);
        btn.OnClientClick = "btn_onClick();";
    }

    void btn_Click(object sender, EventArgs e)
    {
        lit.Text = DateTime.Now.ToString("HH:mm:ss");
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,单击该按钮时,将发生回发,并更新时间.但是当您选中复选框时,下次单击该按钮时,该按钮将被禁用(按预期方式),但永远不会进行回发.

我在这里想念的是什么?

提前致谢.

Ech*_*orm 9

我想你只是错过了这个标签:

UseSubmitBehavior="false"
Run Code Online (Sandbox Code Playgroud)

试试这样:

<asp:Button ID="btnUpdate" runat="server" UseSubmitBehavior="false" OnClientClick="if(Page_ClientValidate()) { this.disabled = true; } else {return false;}" Text = "Update" CssClass="button" OnClick="btnUpdate_Click" ValidationGroup="vgNew"/>
Run Code Online (Sandbox Code Playgroud)

说明

  • @JohnMacIntyre - 对不起,您是否担心asp.net控件中的微软特定技术?这看起来有点傻,不是吗?asp.net是微软特定的开始. (2认同)

Mau*_*fer 6

fallen888是对的,你的方法不能跨浏览器工作.我使用这个小片段来防止双击.


Pav*_*uva 5

UseSubmitBehavior="false"将提交按钮转换为普通按钮(<input type="button">).如果您不希望发生这种情况,可以隐藏提交按钮并立即在其位置插入禁用按钮.因为这种情况发生得太快,所以看起来按钮会被禁用给用户.详情请见Josh Stodola的博客.

代码示例(jQuery):

$("#<%= btnSubmit.ClientID %>").click(function()
{
  $(this)
    .hide()
    .after('<input type="button" value="Please Wait..." disabled="disabled" />');
});
Run Code Online (Sandbox Code Playgroud)