Signatur
Beschreibung
Das Ereignis ratechange wird an einem HTMLMediaElement (also <audio> oder <video>) ausgelöst, sobald sich die Wiedergabegeschwindigkeit ändert. Auslöser ist eine Änderung von playbackRate (aktuelle Geschwindigkeit) oder defaultPlaybackRate (Standardgeschwindigkeit, die z. B. nach dem Laden einer neuen Quelle gilt).
Das Ereignis ist nicht abbrechbar (cancelable: false) und steigt nicht auf (bubbles: false). Den Handler registrierst du entweder mit addEventListener("ratechange", handler) oder über die Eigenschaft onratechange. Willst du es mit Event-Delegation am Elternelement abfangen, brauchst du die Capture-Phase ({ capture: true }).
Typische Anwendungsfälle: eine eigene Geschwindigkeitsanzeige in einem Player aktuell halten (auch wenn der Nutzer das native Kontextmenü oder Browser-Erweiterungen benutzt), die bevorzugte Geschwindigkeit in localStorage speichern, Analysedaten erfassen oder Untertitel- bzw. Animationssynchronisation anpassen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname "ratechange". |
|
| $handler Pflicht | (event: Event) => void | Callback, der ein einfaches Event-Objekt erhält. Die neue Geschwindigkeit liest du über event.target.playbackRate bzw. defaultPlaybackRate aus – das Ereignis selbst enthält keinen Wert. |
|
| $options | boolean | AddEventListenerOptions | false | Optionen wie once, passive, signal oder capture (nötig für Delegation, weil das Ereignis nicht aufsteigt). |
Beispiele
Geschwindigkeitsanzeige mit addEventListener aktualisieren
const video = document.querySelector('video');
const label = document.querySelector('#speed');
video.addEventListener('ratechange', (event) => {
const rate = event.target.playbackRate;
label.textContent = `${rate}×`;
console.log(`Neue Geschwindigkeit: ${rate}`);
});
// Auslösen, z. B. durch einen Button
document.querySelector('#faster').addEventListener('click', () => {
video.playbackRate = Math.min(video.playbackRate + 0.25, 4);
});
Bevorzugte Geschwindigkeit speichern und wiederherstellen
const audio = document.querySelector('audio');
// Gespeicherten Wert als Standard setzen
const saved = Number(localStorage.getItem('podcastRate')) || 1;
audio.defaultPlaybackRate = saved;
audio.playbackRate = saved;
audio.onratechange = () => {
localStorage.setItem('podcastRate', String(audio.playbackRate));
};
Listener per AbortController wieder entfernen
const video = document.querySelector('video');
const controller = new AbortController();
const logRate = () => console.log('Rate:', video.playbackRate);
video.addEventListener('ratechange', logRate, { signal: controller.signal });
video.playbackRate = 2; // löst aus
// Später: Listener abmelden (alternativ removeEventListener)
setTimeout(() => {
controller.abort();
// gleichwertig: video.removeEventListener('ratechange', logRate);
video.playbackRate = 0.5; // kein Log mehr
}, 0);
Delegation für mehrere Player in der Capture-Phase
// ratechange steigt nicht auf – daher capture: true
document.addEventListener('ratechange', (event) => {
if (event.target instanceof HTMLMediaElement) {
console.log(`${event.target.id}: ${event.target.playbackRate}×`);
}
}, { capture: true });
// Wichtig · Fallstricke
- Asynchron: Das Ereignis wird als Task in die Warteschlange gestellt und nicht sofort beim Setzen von
playbackRateausgelöst. Code direkt nach der Zuweisung läuft also vor dem Handler. - Kein Aufsteigen:
ratechangebubbelt nicht. Für Delegation brauchst du{ capture: true }. - Gleicher Wert: Setzt du denselben Wert erneut, wird kein Ereignis ausgelöst.
- Endlosschleifen vermeiden: Wenn du im Handler
playbackRatesetzt (z. B. um Grenzen zu erzwingen), prüfe vorher, ob sich der Wert wirklich unterscheidet. - Wertebereich: Browser unterstützen nur bestimmte Bereiche (etwa 0,0625–16 in Chrome/Firefox). Werte außerhalb werfen einen
NotSupportedError, dann wird keinratechangeausgelöst. Bei0verhalten sich die Browser unterschiedlich. - Tonhöhe: Ob die Tonhöhe bei geänderter Geschwindigkeit erhalten bleibt, steuert
preservesPitch(ältere Browser: mit Präfix). - Das Ereignis wird in allen modernen Browsern unterstützt (Baseline).