私はこの質問が尋ねられたことに気づきましたが、答えはどれも私のプロジェクトではうまくいきませんでした。
クリックするとAPIを呼び出すボタンがあるため、1秒の遅延があります。
何も機能しないことをいくつか試しました。
btnSave.Attributes.Add("onclick", " this.disabled = true; " + ClientScript.GetPostBackEventReference(btnSave, null) + ";");
それでも何もしません。
ダブルクリックを防ぎます。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>
このソリューションはシンプルで効果的です。ボタンに次のコードを含めます。
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>
このコードを使用してダブルクリックを防ぐことができます:
Me.btnSave.Attributes.Add("onclick", "this.disabled=true;")
Me.btnSave.UseSubmitBehavior = False
したがって、btnSave_Click
APIを呼び出します。
通常、Validators
にはPage
がたくさんあります:Validator.SetFocusOnError = True
検証が失敗した場合、このコードを実行して保存ボタンを再度有効にすることができます。
Me.YourControl.Attributes.Add("onfocus", Me.btnSave.ClientID & ".removeAttribute('disabled');")
上記の提案のほとんどは、私にとってはうまくいきませんでした。動作したのは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>
seSubmitBehavior = "false"がキーです。
ダブルクリックを防ぎます。aspxページに以下のコードを追加してください
<script type = "text/javascript">
function DisableButton() {
document.getElementById("<%=Button1.ClientID %>").disabled = true;
}
window.onbeforeunload = DisableButton;
</script>
最初に私の解決策はこのようなものです:
<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;
}
しかし、私の同僚は、ポスト処理が非常に遅い場合、終了する前に、ユーザーがボタンを離してEnterキーを押しながらクリックすることでダブルポストバックを実行できることを指摘しています。だから私は別の2つの解決策を見つけました:
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;
}
}
ASP.NETにはページ内にフォームが1つしかないため(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にこれらの2つのアプローチをテストするように依頼します(編集後:QAは、このアプローチを使用することは非常に危険であると証明しました。詳細については、以下のコメントを参照してください)。
この方法を試してください、それは実用的なソリューションです:
Opera jsをサポートしないモバイルブラウザーを含むすべてのブラウザーの場合、フォームがそのタイプのブラウザーでブロックされないことを意味します。
これを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) + ";");