Empêcher les clics multiples sur le bouton

j'ai le code suivant jQuery pour empêcher le double clic sur un bouton. Il fonctionne très bien. J'utilise Page_ClientValidate() pour m'assurer que le double clic n'est empêché que si la page est valide. [S'il y a des erreurs de validation, l'option ne doit pas être activée car il n'y a pas de postback sur le serveur démarré]

y a-t-il une meilleure méthode pour empêcher le second clic sur le bouton avant que la page ne se recharge?

peut-on mettre le drapeau isOperationInProgress = yesIndicator seulement si la page provoque un postback sur le serveur? Est-il convenable event pour elle qui va être appelée avant que l'utilisateur peut cliquer sur le bouton pour la deuxième fois?

Note : je cherche une solution qui ne nécessitera pas de nouvelle API

Note : cette question n'est pas une copie. Ici, j'essaie d'éviter l'utilisation de Page_ClientValidate() . Aussi je suis à la recherche d'un event où je peux déplacer le code afin que je pas besoin d'utiliser Page_ClientValidate()

Note : aucun ajax impliqué dans mon scénario. Le formulaire ASP.Net sera envoyé au serveur de façon synchrone. Le bouton Evénement de clic dans javascript est seulement pour empêcher le double clic. La soumission du formulaire est synchrone en utilisant ASP.Net.

Code Actuel

$(document).ready(function () {
  var noIndicator = 'No';
  var yesIndicator = 'Yes';
  var isOperationInProgress = 'No';

  $('.applicationButton').click(function (e) {
    // Prevent button from double click
    var isPageValid = Page_ClientValidate();
    if (isPageValid) {
      if (isOperationInProgress == noIndicator) {
        isOperationInProgress = yesIndicator;
      } else {
        e.preventDefault();
      }
    } 
  });
});

Références :

  1. Validateur causes des comportements inadaptés pour double cliquez sur vérifier les
  2. Qu'il s'agisse D'utiliser Page_IsValid ou Page_ClientValidate() (pour les événements secondaires du Client)

Note de @Peter Ivan dans les références ci-dessus:

appeler Page_ClientValidate() de façon répétée peut rendre la page trop obscure (alertes multiples, etc.).).

21
demandé sur Community 2013-05-23 17:22:01

13 réponses

j'ai trouvé cette solution qui est simple et a travaillé pour moi:

<form ...>
<input ...>
<button ... onclick="this.disabled=true;this.value='Submitting...'; this.form.submit();">
</form>

Cette solution a été trouvée dans: solution originale

34
répondu mauronet 2014-12-14 16:33:33

désactiver le bouton sur le clic, l'activer après l'opération complète

$(document).ready(function () {
    $("#btn").on("click", function() {
        $(this).attr("disabled", "disabled");
        doWork(); //this method contains your logic
    });
});

function doWork() {
    alert("doing work");
    //actually this function will do something and when processing is done the button is enabled by removing the 'disabled' attribute
    //I use setTimeout so you can see the button can only be clicked once, and can't be clicked again while work is being done
    setTimeout('$("#btn").removeAttr("disabled")', 1500);
}

exemple pratique

10
répondu Jason 2013-05-23 13:38:33

JS fournit une solution facile en utilisant les propriétés de l'événement:

$('selector').click(function(event) {
  if(!event.detail || event.detail == 1){//activate on first click only to avoid hiding again on multiple clicks
    // code here. // It will execute only once on multiple clicks
  }
});
9
répondu Kalyani 2017-03-08 07:11:20

j'ai modifié la solution de @Kalyani et jusqu'à présent ça a fonctionné à merveille!

$('selector').click(function(event) {
  if(!event.detail || event.detail == 1){ return true; }
  else { return false; }
});
3
répondu plaidcorp 2017-09-27 18:42:20

en utilisant le nombre,

 clickcount++;
    if (clickcount == 1) {}

après être revenu cliquez à nouveau sur le bouton Mettre à zéro.

2
répondu Divya 2016-09-01 10:04:00

nous pouvons utiliser sur et Hors clic pour empêcher les clics multiples. j'ai essayé mon application et ça marche comme prévu.

$(document).ready(function () {     
    $("#disable").on('click', function () {
        $(this).off('click'); 
        // enter code here
    });
})
2
répondu user3340312 2017-06-05 05:55:09

désactivez les événements pointeurs dans la première ligne de votre rappel, puis reprenez-les sur la dernière ligne.

element.on('click', function() {
  element.css('pointer-events', 'none'); 
  //do all of your stuff
  element.css('pointer-events', 'auto');   
};
1
répondu Harold 2016-06-02 13:50:02

peut être cela aidera et donner la fonctionnalité désirée:

$('#disable').on('click', function(){
    $('#disable').attr("disabled", true);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="disable">Disable Me!</button>
<p>Hello</p>
1
répondu Rish 2017-06-05 05:54:34

une façon de procéder est de définir un compteur et si le nombre dépasse le nombre donné, vous devez retourner false. facile que cela.

var mybutton_counter=0;
$("#mybutton").on('click', function(e){
    if (mybutton_counter>0){return false;} //you can set the number to any
    //your call
     mybutton_counter++; //incremental
});

assurez-vous, si la déclaration est en haut de votre appel.

0
répondu Jon Toshmatov 2013-05-23 13:30:57

cela devrait fonctionner pour vous:

$(document).ready(function () {
    $('.applicationButton').click(function (e) {
        var btn = $(this),
            isPageValid = Page_ClientValidate(); // cache state of page validation
        if (!isPageValid) {
            // page isn't valid, block form submission
            e.preventDefault();
        }
        // disable the button only if the page is valid.
        // when the postback returns, the button will be re-enabled by default
        btn.prop('disabled', isPageValid);
        return isPageValid;
    });
});

s'il vous plaît noter que vous devriez également prendre des mesures côté serveur pour éviter les doubles-messages que tous les visiteurs de votre site ne seront pas assez Polis pour le visiter avec un navigateur (et encore moins un navigateur JavaScript-activé).

0
répondu pete 2013-05-23 14:01:54

si vous faites un aller-retour complet post-back, vous pouvez juste faire disparaître le bouton. S'il y a des erreurs de validation, le bouton sera visible à nouveau lors du rechargement de la page.

ajouter un style à votre bouton:

<h:commandButton id="SaveBtn" value="Save"
    styleClass="hideOnClick"
    actionListener="#{someBean.saveAction()}"/>

ensuite, faites-le cacher lorsque cliqué.

$(document).ready(function() {
    $(".hideOnClick").click(function(e) {
        $(e.toElement).hide();
    });
});
0
répondu Pixelstix 2017-04-26 15:51:52

après des heures de recherche je l'ai fixé de cette façon:

    old_timestamp == null;

    $('#productivity_table').on('click', function(event) {

    // code executed at first load
    // not working if you press too many clicks, it waits 1 second
    if(old_timestamp == null || old_timestamp + 1000 < event.timeStamp)
    {
         // write the code / slide / fade / whatever
         old_timestamp = event.timeStamp;
    }
    });
0
répondu William Laszlo 2017-06-15 00:16:25

il suffit de copier coller ce code dans votre script et éditer #button1 avec votre id de bouton et il résoudra votre problème.

 <script type="text/javascript">
                $(document).ready(function(){  
                     $("#button1").submit(function() {
                            $(this).submit(function() {
                                return false;
                            });
                            return true;
                        }); 
        });
     </script
0
répondu 2017-09-20 11:55:13