Loading Indicators
Loading Indicators: free step-by-step lesson with examples, common mistakes, and interview tips — part of jQuery Tutorial on Toolliyo Academy.
On this page
jQuery Tutorial · Lesson 47 of 100
Loading Indicators
Setup & DOM ✓ → Events Effects AJAX → Perf & Integrate → Ship & Projects
Events Effects AJAX · 2 — Interact · ~6 min · AJAX and APIs
What is this?
Show a spinner or aria-busy state when a request starts; clear it in .always(). Disable the triggering button to prevent double submits.
Why should you care?
QueryVerse users on slow 4G need proof that Save is working.
See it live — copy this example
Examples include the jQuery 3.7 CDN. Paste into an HTML file or use Run Example to preview.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>QueryVerse</title>
<style>
body { font-family: system-ui, sans-serif; margin: 1.25rem; }
.box { padding: .75rem; border: 1px solid #ccc; border-radius: 8px; margin: .5rem 0; }
.muted { color: #666; }
button { margin-right: .35rem; margin-top: .35rem; }
input, select, textarea { margin: .25rem 0; }
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: .4rem .55rem; text-align: left; }
.hidden { display: none; }
.row-odd { background: #f7f7f7; }
.active { font-weight: 700; }
.toast { background: #111; color: #fff; padding: .5rem .75rem; border-radius: 6px; }
</style>
</head>
<body>
<button type="button" id="load">Refresh posts</button>
<span id="spin" class="muted hidden">Loading…</span>
<ul id="list" class="box"></ul>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script>
$(function () {
$('#load').on('click', function () {
var $btn = $(this).prop('disabled', true);
$('#spin').removeClass('hidden');
$('#list').attr('aria-busy', 'true');
$.getJSON('https://jsonplaceholder.typicode.com/posts?_limit=3')
.done(function (rows) {
var $list = $('#list').empty();
rows.forEach(function (r) {
$list.append($('<li/>').text(r.title));
});
})
.fail(function () {
$('#list').text('Refresh failed');
})
.always(function () {
$btn.prop('disabled', false);
$('#spin').addClass('hidden');
$('#list').attr('aria-busy', 'false');
});
});
});
</script>
</body>
</html>
Run Example »
Edit the code below and click Run to see the result in Toolliyo’s live editor.
What happened?
- Tie indicators to specific panels, not the whole page, when possible.
- Prefer .always over duplicating cleanup in done and fail.
Practice next
- Click refresh and watch Loading…
- Spam-click while disabled.
- Fail the URL and confirm spinner clears.
- Use a CSS spinner class instead of text.
- Timeout the indicator message after 10s with help text.
Remember
Show busy on start. Clear in always. Disable duplicate clicks.
Slow-network save
A Meesho seller QueryVerse catalog save on patchy city Wi-Fi needs a visible Loading state.
Outcome: Button disable + spinner + always cleanup prevent double posts.
Interview prep for this lesson
Practice these questions aloud after reading—each links to a full structured answer.
Sign in to ask a question or upvote helpful answers.
No questions yet — be the first to ask!