8

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

我确实对此进行了一些研究,上帝知道有足够的信息,但是其他问题,例如Disable button on form submission,禁用按钮似乎有效。提交后禁用按钮的原始海报似乎和我有同样的问题,但没有提到他如何/如果他解决了这个问题。

这是一些关于如何重复它的代码(在 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");
    }
}

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

我到底在想什么???

提前致谢。

4

10 回答 10

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

解释

于 2008-12-30T16:19:03.193 回答
6

fall888 是对的,您的方法不适用于跨浏览器。我使用这个小片段来防止双击。

于 2008-12-30T16:08:13.557 回答
6

UseSubmitBehavior="false"将提交按钮转换为普通按钮 ( <input type="button">)。如果您不希望这种情况发生,您可以隐藏提交按钮并立即在其位置插入禁用按钮。因为这种情况发生得如此之快,它看起来就像按钮被用户禁用。详细信息在Josh Stodola 的博客中

代码示例(jQuery):

$("#<%= btnSubmit.ClientID %>").click(function()
{
  $(this)
    .hide()
    .after('<input type="button" value="Please Wait..." disabled="disabled" />');
});
于 2009-06-27T08:49:46.627 回答
4

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

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

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

现在,用什么代替按钮?

  1. 看起来像禁用按钮的图像
  2. 或者只是显示“请稍候...”的纯文本

这可以以相同的方式完成,但相反。从页面加载时隐藏的元素开始,然后在表单提交时切换到可见的 className。

于 2008-12-30T15:54:51.773 回答
2

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

我们只是将脚本包含在一个全局 JavaScript 文件中,因此在创建新按钮时我们不需要记住任何事情。

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

通过检查 Page_ClientValidate() 可以轻松扩展此脚本。

于 2010-03-30T10:44:19.080 回答
1
document.getElementById('form1').onsubmit = function() {
    document.getElementById('btn').disabled = true;
};
于 2008-12-30T16:30:00.753 回答
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=true";__doPostBack('ID$ID','');"

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

享受!

于 2011-10-29T15:56:38.987 回答
1

对于 JQUERY 用户

在使用 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'

于 2011-10-31T18:03:58.957 回答
0

出于调试目的,如果在 if(chk.checked) 中添加 else 子句会发生什么?

于 2008-12-30T16:01:52.197 回答
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
}
于 2008-12-30T16:47:51.513 回答