Preventing double-clicks and accidental multiple form submissions is a crucial aspect of web development.
In this comprehensive tutorial, we’ll explore how to disable buttons after click using jQuery, covering various scenarios and best practices.
Disable Buttons After Click
Disabling buttons after a click serves several important purposes:
- Prevents duplicate form submissions that can cause data integrity issues
- Improves user experience by providing clear visual feedback
- Reduces server load from multiple identical requests
- Prevents payment processing errors in e-commerce applications
Basic jQuery Button Disable Method
The simple way to disable a button in jQuery is using the .prop() method:
$(document).ready(function() {
$('#myButton').click(function() {
$(this).prop('disabled', true);
});
});<button id="myButton">Submit Form</button>You can see the output in the screenshot below.

The .prop() method is the recommended approach for modern jQuery versions (1.6+) as it directly manipulates the DOM property.
Complete Form Submission Example
Here’s a practical example for form submissions with loading text:
$(document).ready(function() {
$('#submitBtn').click(function() {
// Store original text
var originalText = $(this).text();
// Disable button and change text
$(this).prop('disabled', true)
.text('Processing...')
.addClass('disabled-state');
// Simulate form processing (replace with actual AJAX call)
setTimeout(function() {
// Re-enable after processing (optional)
$('#submitBtn').prop('disabled', false)
.text(originalText)
.removeClass('disabled-state');
}, 3000);
});
});<form id="userForm">
<input type="text" name="username" placeholder="Username" required>
<input type="email" name="email" placeholder="Email" required>
<button id="submitBtn" type="submit">Submit</button>
</form>.disabled-state {
opacity: 0.6;
cursor: not-allowed;
}You can see the output in the screenshot below.

AJAX Form Submission with Button Disable
For AJAX requests, disabling buttons prevents multiple submissions while requests are processing:
$(document).ready(function() {
$('#ajaxForm').submit(function(e) {
e.preventDefault();
var $submitBtn = $(this).find('button[type="submit"]');
var originalText = $submitBtn.text();
// Disable submit button
$submitBtn.prop('disabled', true).text('Submitting...');
$.ajax({
url: '/api/submit',
method: 'POST',
data: $(this).serialize(),
success: function(response) {
alert('Form submitted successfully!');
// Reset form
$('#ajaxForm')[0].reset();
},
error: function(xhr, status, error) {
alert('Submission failed. Please try again.');
},
complete: function() {
// Re-enable button regardless of success/failure
$submitBtn.prop('disabled', false).text(originalText);
}
});
});
});Multiple Buttons Management
When dealing with multiple buttons, you can disable them collectively:
$(document).ready(function() {
$('.action-btn').click(function() {
// Disable all action buttons
$('.action-btn').prop('disabled', true);
var action = $(this).data('action');
// Process the action
processAction(action, function() {
// Re-enable all buttons after completion
$('.action-btn').prop('disabled', false);
});
});
});
function processAction(action, callback) {
// Simulate API call
setTimeout(function() {
console.log('Action completed: ' + action);
callback();
}, 2000);
}<div class="action-panel">
<button class="action-btn" data-action="save">Save</button>
<button class="action-btn" data-action="delete">Delete</button>
<button class="action-btn" data-action="update">Update</button>
</div>You can see the output in the screenshot below.

Use jQuery’s .one() Method
For buttons that should only be clicked once, use the .one() method:
$(document).ready(function() {
$('#oneTimeBtn').one('click', function() {
$(this).prop('disabled', true)
.text('Already Clicked')
.css('background-color', '#ccc');
// Perform one-time action
performOneTimeAction();
});
});
function performOneTimeAction() {
console.log('This action can only be performed once');
// Add your one-time logic here
}Bootstrap Button Integration
When working with Bootstrap buttons, maintain styling consistency:
$(document).ready(function() {
$('.btn-submit').click(function() {
var $btn = $(this);
// Store original classes and text
var originalText = $btn.html();
var originalClasses = $btn.attr('class');
// Disable with Bootstrap styling
$btn.prop('disabled', true)
.html('<span class="spinner-border spinner-border-sm me-2"></span>Loading...')
.removeClass('btn-primary')
.addClass('btn-secondary');
// Simulate processing
setTimeout(function() {
$btn.prop('disabled', false)
.html(originalText)
.attr('class', originalClasses);
}, 3000);
});
});<button class="btn btn-primary btn-submit">
<i class="fas fa-paper-plane me-2"></i>Send Message
</button>Common Troubleshooting Issues
Let me explain to you some common troubleshooting issues that may occur while working with a disabled button after clicking in jQuery.
Issue 1: Button Still Clickable
If your button remains clickable after applying prop(‘disabled’, true), ensure you’re:
- Using .prop() instead of .attr() for jQuery 1.6+
- Selecting the correct element
- Not having conflicting event handlers
Issue 2: Re-enabling Buttons
Always re-enable buttons in AJAX error handlers:
$.ajax({
// ... your AJAX settings
error: function(xhr, status, error) {
// Always re-enable on error
$submitBtn.prop('disabled', false);
},
complete: function() {
// This runs regardless of success/error
$submitBtn.prop('disabled', false);
}
});Performance Best Practices
- Cache jQuery objects: Store $(this) in variables to avoid repeated DOM queries
- Use event delegation: For dynamically added buttons, use .on() with delegation
- Debounce rapid clicks: Implement debouncing for a better user experience
// Event delegation example
$(document).on('click', '.dynamic-btn', function() {
$(this).prop('disabled', true);
// Handle click
});Browser Compatibility
The .prop() method works across all modern browsers and Internet Explorer 9+. For older browsers, you might need to use .attr(‘disabled’, ‘disabled’).
Conclusion
Disabling buttons after a click is essential for creating robust web applications. By implementing these jQuery techniques, you’ll prevent duplicate submissions, improve user experience, and create more professional web interfaces. Remember to always provide visual feedback and handle both success and error scenarios appropriately.
The key is choosing the right method for your specific use case – whether it’s one-time clicks, form submissions, or AJAX requests. With these examples and best practices, you’re well-equipped to implement button disabling functionality in your jQuery applications.
You may also like to read:
- How to Check if jQuery is Loaded
- jQuery Check if String Contains: String Validation
- jQuery Check If ID Exists: Examples
- jQuery Check if Element is Visible

I am Bijay Kumar, a Microsoft MVP in SharePoint. Apart from SharePoint, I started working on Python, Machine learning, and artificial intelligence for the last 5 years. During this time I got expertise in various Python libraries also like Tkinter, Pandas, NumPy, Turtle, Django, Matplotlib, Tensorflow, Scipy, Scikit-Learn, etc… for various clients in the United States, Canada, the United Kingdom, Australia, New Zealand, etc. Check out my profile.