Throttle in Vanilla JavaScript – höchstens alle X Millisekunden feuern
Beim Scrollen oder bei Mausbewegung feuern Events dutzendfach pro Sekunde. Mit Throttle begrenzt du das auf einen Aufruf alle X Millisekunden – der Bruder von Debounce, aber fürs Dauerfeuer.
Debounce wartet auf eine Pause – ideal fürs Suchfeld. Aber beim Scrollen kommt nie eine Pause, solange gescrollt wird. Hier willst du regelmäßig reagieren, nur nicht bei jedem der dutzenden Events pro Sekunde. Genau das macht Throttle: höchstens ein Aufruf pro Zeitfenster.
Die Funktion
function throttle(fn, wait = 200) {
let last = 0;
let timer;
return function (...args) {
const now = Date.now();
const rest = wait - (now - last);
if (rest <= 0) { // Fenster offen → sofort feuern
clearTimeout(timer);
last = now;
fn.apply(this, args);
} else if (!timer) { // letzten Aufruf am Fensterende nachholen
timer = setTimeout(() => {
last = Date.now();
timer = null;
fn.apply(this, args);
}, rest);
}
};
}Anwenden beim Scrollen
const onScroll = throttle(() => {
const oben = window.scrollY > 300;
document.querySelector('#nach-oben').classList.toggle('sichtbar', oben);
}, 150);
window.addEventListener('scroll', onScroll, { passive: true });Statt hunderter Aufrufe pro Sekunde läuft deine Logik jetzt sauber alle 150 ms – die Seite bleibt flüssig. Das { passive: true } sagt dem Browser zusätzlich, dass du das Scrollen nicht blockierst, was das Scrollen noch geschmeidiger macht.
Merksatz: Debounce = „warte, bis Ruhe ist" (Suche). Throttle = „höchstens alle X ms" (Scroll, Resize, Mausbewegung).
Solche Performance-Details baue ich in jede Seite ein. Wenn du eine schnelle, moderne Website brauchst: bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
Web Worker – rechnen, ohne die Oberfläche einzufrieren
JavaScript hat im Browser genau einen Faden für alles: Klicks, Animationen, Layout – und deine Rechenschleife. Dauert die zwei Sekunden, ist die Seite zwei Sekunden lang tot. Ein Worker nimmt die Arbeit auf einen eigenen Faden.
CustomEvent – Bausteine, die sich gegenseitig Bescheid sagen, ohne sich zu kennen
Sobald zwei Teile einer Seite aufeinander reagieren sollen, landet man schnell bei globalen Variablen oder Funktionsaufrufen quer durchs Projekt. Eigene Events entkoppeln das – mit denselben Mitteln, die der Browser selbst benutzt.
Formulare ohne Neuladen abschicken – FormData und fetch
Ein Formular per JavaScript abzuschicken heißt nicht, jedes Feld einzeln auszulesen. FormData nimmt das ganze Formular, fetch schickt es weg – inklusive Dateien, und mit einer Fehlermeldung, die der Besucher versteht.