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
requestAnimationFrame – die Animationsschleife, die zum Bildschirm passt
setInterval(schritt, 16) läuft auf einem 144-Hz-Monitor anders als auf einem alten Handy – und im Hintergrundtab einfach weiter. requestAnimationFrame löst beides, wenn man die verstrichene Zeit mitrechnet statt Bilder zu zählen.
toSorted, toReversed und with: Arrays sortieren, ohne das Original zu zerstören
array.sort() sortiert nicht eine Kopie, sondern das Array selbst – und genau daran ist schon mancher Zustand im Frontend stillschweigend kaputtgegangen. Seit ES2023 gibt es zu jeder dieser Methoden eine Variante, die eine Kopie zurückgibt.
Aufzählungen richtig verketten mit Intl.ListFormat
"a, b und c" von Hand zusammenzubauen geht fast immer schief – bei einem Element, bei zwei Elementen, beim letzten Komma. Intl.ListFormat macht es richtig, in jeder Sprache, ganz ohne Bibliothek.