Preventing multiple clicks on button

JavascriptJquery

Javascript Problem Overview


I have following jQuery code to prevent double clicking a button. It works fine. I am using Page_ClientValidate() to ensure that the double click is prevented only if the page is valid. [If there are validation errors the flag should not be set as there is no postback to server started]

Is there a better method to prevent the second click on the button before the page loads back?

Can we set the flag isOperationInProgress = yesIndicator only if the page is causing a postback to server? Is there a suitable event for it that will be called before the user can click on the button for the second time?

Note: I am looking for a solution that won't require any new API

Note: This question is not a duplicate. Here I am trying to avoid the use of Page_ClientValidate(). Also I am looking for an event where I can move the code so that I need not use Page_ClientValidate()

Note: No ajax involved in my scenario. The ASP.Net form will be submitted to server synchronously. The button click event in javascript is only for preventing double click. The form submission is synchronous using ASP.Net.

Present Code

$(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();
      }
    } 
  });
});

References:

  1. https://stackoverflow.com/questions/13825543/validator-causes-improper-behavior-for-double-click-check
  2. https://stackoverflow.com/questions/13832818/whether-to-use-page-isvalid-or-page-clientvalidate-for-client-side-events

Note by @Peter Ivan in the above references: >calling Page_ClientValidate() repeatedly may cause the page to be too obtrusive (multiple alerts etc.).

Javascript Solutions


Solution 1 - Javascript

I found this solution that is simple and worked for me:

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

This solution was found in: Original solution

Solution 2 - Javascript

JS provides an easy solution by using the event properties:

$('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
  }
});

Solution 3 - Javascript

disable the button on click, enable it after the operation completes

$(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);
}

working example

Solution 4 - Javascript

I modified the solution by @Kalyani and so far it's been working beautifully!

$('selector').click(function(event) {
  if(!event.detail || event.detail == 1){ return true; }
  else { return false; }
});

Solution 5 - Javascript

Disable pointer events in the first line of your callback, and then resume them on the last line.

element.on('click', function() {
  element.css('pointer-events', 'none'); 
  //do all of your stuff
  element.css('pointer-events', 'auto');   
};

Solution 6 - Javascript

After hours of searching i fixed it in this way:

    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;
    }
    });

Solution 7 - Javascript

May be this will help and give the desired functionality :

$('#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>

Solution 8 - Javascript

using count,

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

After coming back again clickcount set to zero.

Solution 9 - Javascript

We can use on and off click for preventing Multiple clicks. i tried it to my application and it's working as expected.

$(document).ready(function () {     
    $("#disable").on('click', function () {
        $(this).off('click'); 
        // enter code here
    });
})

Solution 10 - Javascript

you can use jQuery's [one][1] :

> .one( events [, data ], handler ) Returns: jQuery > > Description: Attach a handler to an event for the elements. The handler is executed at most once per element per event type.

see examples:

using jQuery: https://codepen.io/loicjaouen/pen/RwweLVx

// add an even listener that will run only once
$("#click_here_button").one("click", once_callback);

Solution 11 - Javascript

This should work for you:

$(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;
    });
});

Please note that you should also take steps server-side to prevent double-posts as not every visitor to your site will be polite enough to visit it with a browser (let alone a JavaScript-enabled browser).

Solution 12 - Javascript

One way you do this is set a counter and if number exceeds the certain number return false. easy as this.

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
});

make sure, if statement is on top of your call.

Solution 13 - Javascript

If you are doing a full round-trip post-back, you can just make the button disappear. If there are validation errors, the button will be visible again upon reload of the page.

First set add a style to your button:

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

Then make it hide when clicked.

$(document).ready(function() {
	$(".hideOnClick").click(function(e) {
		$(e.toElement).hide();
	});
});

Solution 14 - Javascript

Just copy paste this code in your script and edit #button1 with your button id and it will resolve your issue.

 <script type="text/javascript">
        		$(document).ready(function(){  
        			 $("#button1").submit(function() {
        		            $(this).submit(function() {
        		                return false;
        		            });
        		            return true;
        		        }); 
        });
     </script

Solution 15 - Javascript

Plain JavaScript:

  1. Set an attribute to the element being interacted
  2. Remove the attribute after a timeout
  3. If the element has the attribute, do nothing

const throttleInput = document.querySelector('button');

throttleInput.onclick = function() {
  if (!throttleInput.hasAttribute('data-prevent-double-click')) {
    throttleInput.setAttribute('data-prevent-double-click', true);
    throttleInput.setAttribute('disabled', true);
    document.body.append("Foo!");
  }

  setTimeout(function() {
    throttleInput.removeAttribute('disabled');
    throttleInput.removeAttribute('data-prevent-double-click');
  }, 3000);
}

<button>Click to add "Foo"!</button>

Solution 16 - Javascript

We also set the button to .disabled=true. I added the HTML Command input with type hidden to identify if the transaction has been added by the Computer Server to the Database.

Example HTML and PHP Commands:

<button onclick="myAddFunction(<?php echo $value['patient_id'];?>)" id="addButtonId">ADD</button>
<input type="hidden" id="hasPatientInListParam" value="<?php echo $hasPatientInListParamValue;?>">

Example Javascript Command:

function myAddFunction(patientId) {	
  document.getElementById("addButtonId").disabled=true;

  var hasPatientInList = document.getElementById("hasPatientInListParam").value;

  if (hasPatientInList) {
    alert("Only one (1) patient in each List.");
	return;
  }

  window.location.href = "webAddress/addTransaction/"+patientId; //reloads page
}

After reloading the page, the computer auto-sets the button to .disabled=false. At present, these actions prevent the multiple clicks problem in our case.

I hope these help you too.

Thank you.

Solution 17 - Javascript

The absolute best way I've found is to immediately disable the button when clicked:

$('#myButton').click(function() {
    $('#myButton').prop('disabled', true);
});

And re-enable it when needed, for example:

  • validation failed
  • error while processing the form data by the server, then after an error response using jQuery

Another way to avoid a quick double-click is to use the native JavaScript function ondblclick, but in this case it doesn't work if the submit form works through jQuery.

Solution 18 - Javascript

One way I found that works is using bootstrap css to display a modal window with a spinner on it. This way nothing in the background can be clicked. Just need to make sure that you hide the modal window again after your long process completes.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLCJView Question on Stackoverflow
Solution 1 - JavascriptmauronetView Answer on Stackoverflow
Solution 2 - JavascriptKalyaniView Answer on Stackoverflow
Solution 3 - JavascriptJasonView Answer on Stackoverflow
Solution 4 - JavascriptplaidcorpView Answer on Stackoverflow
Solution 5 - JavascriptHaroldView Answer on Stackoverflow
Solution 6 - JavascriptWilliam LaszloView Answer on Stackoverflow
Solution 7 - JavascriptRishView Answer on Stackoverflow
Solution 8 - JavascriptDivyaView Answer on Stackoverflow
Solution 9 - Javascriptuser3340312View Answer on Stackoverflow
Solution 10 - Javascriptloic.jaouenView Answer on Stackoverflow
Solution 11 - JavascriptpeteView Answer on Stackoverflow
Solution 12 - JavascriptJon ToshmatovView Answer on Stackoverflow
Solution 13 - JavascriptPixelstixView Answer on Stackoverflow
Solution 14 - Javascriptuser6782881View Answer on Stackoverflow
Solution 15 - JavascriptLucas BustamanteView Answer on Stackoverflow
Solution 16 - JavascriptmasarapmabuhayView Answer on Stackoverflow
Solution 17 - Javascriptuser2342558View Answer on Stackoverflow
Solution 18 - JavascriptJoseph NacionView Answer on Stackoverflow