Switch It Off Before They Find It: Five Default Loaders That Fail a UK Accessibility Audit
Photo: And85rew, CC BY-SA 4.0, via Wikimedia Commons
Most accessibility audits do not fall over in the places you expect. Your heading order is tidy. Your form labels are present. Then the reviewer opens the page with a keyboard, and the chat bubble swallows focus like a dropped call. The culprit is usually not hand-written markup. It is a third-party loader that arrived during a campaign, stayed for a support trial, and has been quietly loading ever since.
At MonkeyLoader we are biased, but the pattern is clear: the fastest accessibility win is often deletion. Not a redesign. Not another overlay. Just switching off the thing that was never earning its place. This is a practical pass for five default loaders that UK teams leave on far too long, plus the few replacements worth keeping and a short script to run before the reviewer arrives.
Default-on is the real problem
Third-party loaders tend to enter through a plugin, a tag manager or a snippet pasted into a template. They bring JavaScript, CSS, iframes, buttons and sometimes a second cookie banner. Each one can change focus order, add unlabelled controls, trap keyboard users, autoplay motion or inject content that screen readers announce at the wrong moment.
For UK public sector teams, this is not just a WCAG 2.2 AA box-ticking exercise. The Public Sector Bodies Accessibility Regulations have been in force since 2018, and the Equality Act 2010 still applies to services. For private teams, an audit finding can still block procurement or delay a launch. The point is not to panic. The point is to stop treating every loader as permanent infrastructure.
The five loaders to put on the table
1. The chat widget nobody staffs
Chat launchers are usually a div styled as a button, not a real button. They can auto-open on page load, steal focus, trap Tab inside an iframe and fire announcements through live regions before the user has read the page. If the widget is not actively staffed during the hours it appears, delete it. A contact form and a phone number are more honest.
If it must stay, load it only after the user activates a real button. Use a native button for the launcher, return focus when the panel closes and respect reduced-motion settings. Do not auto-open the panel on mobile.
2. The heatmap and session-replay tag
Heatmap tools often render overlays, record interactions and inject scripts that assume a mouse. Keyboard users can trigger handlers that were never tested without a pointer. Session replay can also capture form fields and personal data, which makes it a PECR and UK GDPR conversation before it is an accessibility one.
Delete it if nobody has opened a heatmap report in the last quarter. If it stays, gate it behind consent, exclude form fields and sensitive pages, sample the traffic and document the decision. Then test it with keyboard only. If the page behaves differently with the tag on, it is not ready.
3. The heavyweight cookie banner
Do not delete consent. Delete the default loader that treats consent as a modal decoration. Common failures include focus that escapes behind the banner, no Escape key support, reject buttons that are harder to reach than accept, and a banner that reappears on every page because the preference is stored badly.
A small, server-rendered consent component or a lightweight consent-aware loader is often enough. Use a native dialog pattern, trap focus properly, make accept and reject equally available, and write the choice to a first-party cookie. The banner should not be a second website.
4. The auto-rotating review carousel
Carousels are where good reviews go to become keyboard traps. Off-screen slides often stay in the tab order, autoplay moves content while someone is reading, and pause buttons are hidden or missing. If the reviews are static content, delete the carousel and show three of them as a list. That is better for everyone.
If a carousel genuinely must stay, remove autoplay, provide visible previous and next buttons, keep hidden slides out of the tab order and use proper list semantics. Do not use aria-hidden on a slide that still contains focusable links.
5. The third-party font loader
Font loaders are easy to forget because they look harmless. They can inject CSS late, cause invisible text, shift layout and load icon fonts that screen readers read as gibberish. A third-party font loader is rarely worth the risk.
Self-host the WOFF2 files, use font-display: swap, preload one weight and provide a sensible system fallback. If you use icon fonts, replace them with inline SVG and accessible labels. That is usually faster and more predictable than another external request.
A deletion checklist that survives an audit
- Inventory the loaders. Use the browser network panel and search the DOM for iframes, buttons and script tags from third-party domains.
- Name an owner for each one. If nobody owns it, it is a deletion candidate.
- Write down the purpose in one sentence. If the sentence is vague, the loader is vague.
- Test keyboard only. Tab through the page, open and close each widget, and check where focus lands.
- Do a quick screen-reader pass with NVDA or VoiceOver. Listen for repeated announcements, unlabelled buttons and content that appears before the user asks for it.
- Check reduced motion. Autoplay, parallax and animated launchers should settle down.
- Check consent. Anything that records, profiles or sets non-essential cookies should wait for a choice.
- Remove it in staging first. Compare the page with and without the loader.
- Document the exception if it stays. An audit is easier when the decision is written down.
Replacement patterns worth keeping
The best replacement is usually less software, not more. Load on interaction. Use native buttons and dialog elements. Return focus when something closes. Respect reduced motion. Gate recording tools behind consent. Self-host fonts. Put static reviews in a list. None of this is glamorous, but it is the sort of no-nonsense plumbing that keeps a page usable after launch.
A short pre-audit check
This Playwright snippet will not replace a proper audit, but it will surface the usual suspects: third-party scripts and the first fifteen elements in the tab order. Run it against staging, then repeat the keyboard pass by hand.
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto(process.env.URL || 'https://example.co.uk', { waitUntil: 'networkidle' });
const scripts = await page.$$eval('script[src]', els =>
els.map(el => el.src).filter(src => !src.startsWith(location.origin))
);
console.log('Third-party scripts:', scripts);
for (let i = 0; i < 15; i++) {
await page.keyboard.press('Tab');
const focused = await page.evaluate(() => {
const el = document.activeElement;
return el ? el.outerHTML.slice(0, 120) : 'none';
});
console.log(i + 1, focused);
}
await browser.close();
})();
If a chat launcher appears twice, a cookie banner catches focus before the main content or a carousel slide keeps showing up in the tab order, you have found your next deletion. Switch it off, test again, then book the audit. The reviewer will find less because you found it first.