防止双击asp.net按钮

zaq34kh6  于 2023-03-20  发布在  .NET
关注(0)|答案(9)|浏览(216)

我意识到这个问题已经被问到了,但没有一个答案对我的项目起作用。
我有一个按钮,当点击调用一个API,所以有1秒的延迟。
我试过几种方法,都不管用。

btnSave.Attributes.Add("onclick", " this.disabled = true; " + ClientScript.GetPostBackEventReference(btnSave, null) + ";");

即使这样也无济于事。

7xzttuei

7xzttuei1#

防止双击。请在aspx页面中添加以下代码。

<script type="text/javascript" language="javascript">

   Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);
   function BeginRequestHandler(sender, args) { var oControl = args.get_postBackElement(); oControl.disabled = true; }

</script>
p4tfgftt

p4tfgftt2#

此解决方案简单有效。在您的按钮上包含以下代码:

OnClientClick="return CheckDouble();"

在您需要JavaScript的任何位置-例如,在页面底部:

<script type="text/javascript">
   var submit = 0;
   function CheckDouble() {
     if (++submit > 1) {
     alert('This sometimes takes a few seconds - please be patient.');
     return false;
   }
 }
 </script>
2nbm6dog

2nbm6dog3#

上面的大多数建议对我都不起作用,唯一起作用的是tezzo的以下建议:

Me.btnSave.Attributes.Add("onclick", "this.disabled=true;")
Me.btnSave.UseSubmitBehavior = False

更简单的是,不要在代码隐藏中使用上面的代码,只需使用以下代码:

<asp:Button ID="btnSave" runat="server" Text="Save" 
      UseSubmitBehavior="false"
      OnClientClick="this.disabled='true';" 
   </asp:button>

**使用提交行为=“假”**是键。

vsmadaxz

vsmadaxz4#

可以使用以下代码防止双击:

Me.btnSave.Attributes.Add("onclick", "this.disabled=true;")
Me.btnSave.UseSubmitBehavior = False

因此,您可以使用btnSave_Click来调用API。
通常我的Page中有很多Validators:设置Validator.SetFocusOnError = True如果验证失败,我可以运行此代码重新启用保存按钮。

Me.YourControl.Attributes.Add("onfocus", Me.btnSave.ClientID & ".removeAttribute('disabled');")
bvn4nwqk

bvn4nwqk5#

这是我发现在所有情况下都有效的一个。

<form id="form1" runat="server">
<asp:Button ID="Button1" runat="server" Text="Button1" OnClick="Button1_Clicked" />
<asp:Button ID="Button2" runat="server" Text="Button2" />
</form>

Now here’s the short JavaScript snippet that will disable the button as soon as it is clicked so that when PostBack occurs the button cannot be clicked again.
<script type = "text/javascript">
function DisableButton() {
    document.getElementById("<%=Button1.ClientID %>").disabled = true;
}
window.onbeforeunload = DisableButton;
</script>

The above script disables the ASP.Net Button as soon as the page is ready to do a PostBack or the ASP.Net form is submitted.
But in cases you might want to disable all Buttons and Submit Buttons on the page hence for such cases I have created another function which disables all Buttons and Submit buttons whenever there’s a PostBack or form submission
<script type = "text/javascript">
function DisableButtons() {
    var inputs = document.getElementsByTagName("INPUT");
    for (var i in inputs) {
        if (inputs[i].type == "button" || inputs[i].type == "submit") {
            inputs[i].disabled = true;
        }
    }
}
window.onbeforeunload = DisableButtons;
</script>
f45qwnt8

f45qwnt86#

防止双击。请在您的aspx页面中添加以下代码

<script type = "text/javascript">
function DisableButton() {
document.getElementById("<%=Button1.ClientID %>").disabled = true;
}
window.onbeforeunload = DisableButton;
</script>
k10s72fa

k10s72fa7#

一开始我的解决方案是这样的:

<script>
function disableButton(btn) {
    setTimeout(function () { btn.disabled = true; }, 20);
    return true;
}
</script>
<asp:Button runat="server" ID="btnSave" Text="Save" OnClick="btnSave_Click" OnClientClick="return disableButton(this);" />

如果不使用setTimeout,则按钮将立即被禁用,然后不会触发OnClick事件。这种方法的缺点是,如果某些验证失败或发生某些错误,则保存按钮将不再可用。
所以我不认为禁用按钮是一个很好的解决方案,并想出了另一个解决方案:

function disableButton(btn) {
        if (btn.hasclicked) return false;
        btn.hasclicked = 1;
        btn.onmouseenter = function () { this.hasclicked = 0; };
        return true;
    }

但是我的同事指出,如果后期处理很慢,在后期处理完成之前,用户仍然可以通过leave-enter-click按钮进行双回发,所以我又想出了另外两个解决方案:
1.在提交表单之前从客户端运行验证,但如果您的页面包含多个ValidationGroup,则需要多次调用下面的Page_ClientValidate(),并传入ValidationGroup参数:例如,页面_客户端验证(“组1”):

function disableButton(btn) {
  if (Page_ClientValidate) {
    Page_ClientValidate();
    if (!Page_IsValid) {
      btn.setAttribute("btnClicked", "n");
      return true;
    }
  }
  if (btn.getAttribute("btnClicked") == "y") {
    return false;
  } else {
    btn.setAttribute("btnClicked", "y");
    return true;
  }
}

1.由于ASP.NET在一个页面中只有一个表单(而不是ASP.NET MVC),我们也可以让表单的onsubmit客户端事件拦截双击:

function disableButton(btn) {
$("form").submit(function () {
    if (btn.getAttribute("btnClicked") == "y") 
        return false;
    else 
        btn.setAttribute("btnClicked", "y");
        return true;
});}

我将要求QA测试这两种方法(后期编辑:QA已经证明使用这种方法是非常危险的,请参考我下面的评论以了解详细信息)。

blpfk2vs

blpfk2vs8#

试试这个方法,它是一个有效的解决方案:

对于所有浏览器,包括不支持js的Opera移动的浏览器,意味着您的表单不会在该类型的浏览器中被阻止。
在Page_load()方法中添加以下内容:

BtnID.Attributes.Add("onclick", "if(typeof (Page_ClientValidate) === 'function' && !Page_ClientValidate()){return false;} this.disabled = true;this.value = 'Working...';" + ClientScript.GetPostBackEventReference(BtnID, null) + ";");
rhfm7lfc

rhfm7lfc9#

这对我也有效

添加(“onclick”,“if(类型(页面客户端验证)=== '函数' &&!页面客户端验证()){返回false;}此.禁用=真;此.value =“正在运行...”;“+客户端脚本.获取回发后事件引用(绑定ID,空)+“;“);

相关问题