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

时间:2008-12-30 15:49:32

标签: asp.net javascript client-scripting double-submit-prevention

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

我确实对此做了一些研究,上帝知道有足够的信息,但其他问题如Disable button on form submission,禁用按钮似乎有效。 Disable button after submit的原始海报似乎与我有同样的问题,但没有提及如何/如果他解决它。

这里有一些关于如何重复它的代码(在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>

我的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");
    }
}

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

我在这里想念的是什么?

提前致谢。

10 个答案:

答案 0 :(得分:9)

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

UseSubmitBehavior="false"

试试这样:

<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"/>

Explanation

答案 1 :(得分:6)

fallen888是对的,你的方法不能跨浏览器工作。我使用this little snippet来阻止双击。

答案 2 :(得分:5)

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

代码示例(jQuery):

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

答案 3 :(得分:4)

“禁用”HTML控件并不总能在所有主流浏览器中产生一致的行为。所以我试图在客户端远离这样做,因为(使用ASP.NET模型)你需要在这种情况下跟踪客户端和服务器上元素的状态。

我要做的是通过将按钮的className切换到包含以下内容的CSS类,将按钮移出窗口的可见部分:

.hiddenButton
{
  position: absolute;
  top: -1000px;
  left: -1000px;
}

现在,用什么代替按钮?

  1. 看似禁用按钮的图像
  2. 或只是简单的文字说“请稍候......”
  3. 这可以通过相同的方式完成,但反之亦然。从页面加载时隐藏的元素开始,然后切换到表单提交上的可见className。

答案 4 :(得分:2)

我们使用以下JQuery脚本,在点击一键时禁用所有按钮(输入类型=提交和按钮)。

我们只是将脚本包含在全局JavaScript文件中,因此在创建新按钮时我们不必记住任何内容。

$(document).ready(function() {
    $(":button,:submit").bind("click", function() {
        setTimeout(function() {
            $(":button,:submit").attr("disabled", "true");
        }, 0);
    });
});

通过检查Page_ClientValidate()。

可以轻松扩展此脚本

答案 5 :(得分:1)

document.getElementById('form1').onsubmit = function() {
    document.getElementById('btn').disabled = true;
};

答案 6 :(得分:1)

这是正确而简单的方法:

它适用于所有浏览器(与上面接受的解决方案不同)。

在您的应用程序中创建一个帮助器方法(例如在Utlity命名空间中):

    Public Shared Sub PreventMultipleClicks(ByRef button As System.Web.UI.WebControls.Button, ByRef page As System.Web.UI.Page)
        button.Attributes.Add("onclick", "this.disabled=true;" + page.ClientScript.GetPostBackEventReference(button, String.Empty).ToString)
    End Sub

现在,您可以通过每个网页的代码调用:

    Utility.PreventMultipleClicks(button1, page)

其中button1是您要阻止多次点击的按钮。

这样做只是将点击处理程序设置为:this.disabled = true

然后追加按钮自己的回发处理程序,所以我们得到:

的onclick = “this.disabled =真”; __ doPostBack( 'ID $ ID', '');“

这不会破坏页面的默认行为,并且可以按预期在所有浏览器中使用。

享受!

答案 7 :(得分:0)

出于调试目的,如果你对if(chk.checked)添加了一个else子句会怎么样?

答案 8 :(得分:0)

确保你的javascript函数返回true(或者一个值为boolean true的值),否则表单将不会被提交。

function btn_click()
var chk = document.getElementById("chk");
    if(chk.checked)
    {
            var btn = document.getElementById("btn");
            btn.disabled = true;
            return true;   //this enables the controls action to propagate
    }
    else    return false;  //this prevents it from propagating
}

答案 9 :(得分:0)

FOR JQUERY USERS

使用jQuery事件侦听器时,您将遇到各种问题,试图将javascript直接添加到ASP.NET按钮上的onClick事件。

我发现禁用按钮并使回发工作的最佳方法是执行以下操作:

    $(buttonID).bind('click', function (e) {

        if (ValidateForm(e)) {

            //client side validation ok!
            //disable the button:
            $(buttonID).attr("disabled", true);

            //force a postback:
            try {
                __doPostBack($(buttonID).attr("name"), "");
                return true;
            } catch (err) {
                return true;
            }

        }
        //client side validation failed!
        return false;
    });

ValidateForm 是您的自定义验证函数,如果您的表单验证客户端,则返回true或false。

buttonID 是您的按钮的ID,例如'#button1'