Je réalise que cette question a été posée mais aucune des réponses n’a fonctionné pour mon projet.
J'ai un bouton qui, lorsqu'il est cliqué, appelle une API, il y a donc un délai d'une seconde.
J'ai essayé plusieurs choses que rien ne fonctionne.
btnSave.Attributes.Add("onclick", " this.disabled = true; " + ClientScript.GetPostBackEventReference(btnSave, null) + ";");
Même cela ne fait rien.
Empêcher le double-clic .Veuillez ajouter le code ci-dessous dans votre page 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>
Cette solution est simple et efficace. Sur votre bouton, incluez ce code:
OnClientClick="return CheckDouble();"
Et partout où vous voulez que votre JavaScript - par exemple. Au bas de votre page:
<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>
Vous pouvez empêcher le double-clic en utilisant ce code:
Me.btnSave.Attributes.Add("onclick", "this.disabled=true;")
Me.btnSave.UseSubmitBehavior = False
Vous pouvez donc utiliser btnSave_Click
pour appeler votre API.
J'ai généralement beaucoup de Validators
dans ma Page
: paramètre Validator.SetFocusOnError = True
je peux exécuter ce code pour réactiver le bouton d'enregistrement si la validation échoue.
Me.YourControl.Attributes.Add("onfocus", Me.btnSave.ClientID & ".removeAttribute('disabled');")
La plupart des suggestions ci-dessus n'ont pas fonctionné pour moi. Celui qui a fonctionné a été le suivant par tezzo:
Me.btnSave.Attributes.Add("onclick", "this.disabled=true;")
Me.btnSave.UseSubmitBehavior = False
Plus simple encore, plutôt que d'utiliser ce qui précède dans le code-behind, utilisez simplement ce qui suit:
<asp:Button ID="btnSave" runat="server" Text="Save"
UseSubmitBehavior="false"
OnClientClick="this.disabled='true';"
</asp:button>
UseSubmitBehavior = "false" est la clé.
Empêcher le double clic. S'il vous plaît ajouter le code ci-dessous dans votre page aspx
<script type = "text/javascript">
function DisableButton() {
document.getElementById("<%=Button1.ClientID %>").disabled = true;
}
window.onbeforeunload = DisableButton;
</script>
Au début, ma solution est la suivante:
<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);" />
Sans setTimeout, le bouton sera immédiatement désactivé et l'événement OnClick ne sera pas déclenché. L'inconvénient de cette approche est que le bouton Enregistrer ne sera plus accessible si une validation échoue ou si une erreur survient.
Donc, je ne pense pas que désactiver le bouton soit une bonne solution et proposer une autre solution:
function disableButton(btn) {
if (btn.hasclicked) return false;
btn.hasclicked = 1;
btn.onmouseenter = function () { this.hasclicked = 0; };
return true;
}
Mais mon collègue fait remarquer que si le post-traitement est très lent, l'utilisateur est toujours en mesure d'effectuer la double publication en laissant-entrer-cliquer dessus. J'ai donc trouvé deux autres solutions:
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;
}
}
Comme ASP.NET n'a qu'un seul formulaire dans une page (pas ASP.NET MVC), nous pouvons également laisser l'événement client onsubmit du formulaire pour intercepter le double-clic:
function disableButton(btn) {
$("form").submit(function () {
if (btn.getAttribute("btnClicked") == "y")
return false;
else
btn.setAttribute("btnClicked", "y");
return true;
});}
Je vais demander à QA de tester ces deux approches (Post edit: QA a prouvé qu'il était très dangereux d'utiliser cette approche. Veuillez vous reporter à mes commentaires suivants pour plus de détails ).