Signatur
Beschreibung
Das Ereignis cuechange wird auf einem <track>-Element (HTMLTrackElement) ausgelöst, sobald sich die Menge der aktiven Cues des zugehörigen TextTrack ändert. Das passiert, wenn während der Wiedergabe ein Cue beginnt oder endet oder wenn der Nutzer an eine andere Stelle springt. Dasselbe Ereignis wird auch direkt auf dem TextTrack-Objekt (trackElement.track) ausgelöst.
Registrieren kann man es mit addEventListener("cuechange", handler) oder über die Eigenschaft oncuechange. Das Ereignis ist ein einfaches Event, steigt nicht auf (bubbelt nicht) und kann nicht abgebrochen werden. Welche Cues gerade aktiv sind, liest man im Handler aus event.target.track.activeCues (beim Track-Element) oder aus event.target.activeCues (beim TextTrack).
Typische Einsatzzwecke sind eigene Untertitel-Darstellungen (z. B. ein gestaltetes Overlay statt der Browser-Anzeige), synchronisierte Transkripte, Kapitelnavigation und das Auswerten von metadata-Tracks, mit denen man zeitgesteuert Inhalte der Seite ändert (etwa Folien, Produkthinweise oder Quiz-Fragen).
Wichtig: Cues werden nur geladen und aktiv, wenn der Track-Modus "showing" oder "hidden" ist. Bei "disabled" (Standard für nicht voreingestellte Tracks) feuert cuechange nicht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname "cuechange". |
|
| $handler Pflicht | (event: Event) => void | Callback, der bei jeder Änderung der aktiven Cues aufgerufen wird. event.target ist das HTMLTrackElement bzw. der TextTrack. |
|
| $options | boolean | AddEventListenerOptions | false | Optionale Einstellungen wie once, signal oder capture. |
Rückgabewert
addEventListener gibt nichts zurück. Der Handler erhält ein Event-Objekt ohne zusätzliche Eigenschaften.Beispiele
Aktive Untertitel in eigenem Overlay anzeigen
// HTML: <video id="video" src="film.mp4" controls>
// <track id="subs" kind="subtitles" src="de.vtt" srclang="de" default>
// </video>
// <div id="overlay"></div>
const trackEl = document.getElementById('subs');
const overlay = document.getElementById('overlay');
// Browser-Anzeige ausblenden, Cues aber weiterhin aktiv halten
trackEl.track.mode = 'hidden';
trackEl.addEventListener('cuechange', (event) => {
const cues = event.target.track.activeCues;
const text = Array.from(cues ?? [], (cue) => cue.text).join('\n');
overlay.textContent = text;
console.log('Aktive Cues:', cues?.length ?? 0);
});
Über die on-Property und direkt am TextTrack
const video = document.querySelector('video');
const track = video.textTracks[0];
track.mode = 'hidden';
// Variante 1: on-Property am TextTrack
track.oncuechange = () => {
const cue = track.activeCues?.[0];
if (cue) console.log(`[${cue.startTime.toFixed(1)}s] ${cue.text}`);
};
// Handler wieder entfernen
// track.oncuechange = null;
Metadaten-Track steuert Folienwechsel, Listener wieder entfernen
// <track id="meta" kind="metadata" src="folien.vtt">
// Cue-Text z. B.: {"slide": 4}
const metaTrack = document.getElementById('meta');
metaTrack.track.mode = 'hidden';
const onCueChange = () => {
for (const cue of metaTrack.track.activeCues ?? []) {
const { slide } = JSON.parse(cue.text);
document.querySelector('#folie').src = `folien/${slide}.png`;
console.log('Wechsel zu Folie', slide);
}
};
metaTrack.addEventListener('cuechange', onCueChange);
// Beim Verlassen der Präsentation aufräumen
document.getElementById('beenden').addEventListener('click', () => {
metaTrack.removeEventListener('cuechange', onCueChange);
});
// Wichtig · Fallstricke
- Track-Modus beachten: Bei
track.mode === "disabled"werden keine Cues geladen, undcuechangefeuert nicht. Für eigene Darstellungen"hidden"setzen. - Das Ereignis sagt nur, dass sich etwas geändert hat. Welche Cues hinzugekommen oder weggefallen sind, muss man selbst über
activeCuesoder dieenter- undexit-Ereignisse einzelnerVTTCue-Objekte ermitteln. activeCueskannnullsein, solange der Track nicht geladen ist. Deshalb defensiv mit?.bzw.?? []zugreifen.- Das Ereignis wird nicht exakt zum Zeitpunkt eines Cues ausgelöst, sondern im Rhythmus der Zeitaktualisierung der Wiedergabe (ähnlich
timeupdate, meist alle 15–250 ms). Für bildgenaue Synchronisation ist es nicht geeignet. - Die Cue-Texte kommen aus externen WebVTT-Dateien. Nicht ungeprüft per
innerHTMLeinfügen (XSS-Gefahr), sonderntextContentodercue.getCueAsHTML()verwenden. - WebVTT-Dateien von fremden Domains brauchen CORS und am Medienelement das Attribut
crossorigin. - Browser-Kompatibilität: wird von allen modernen Browsern (Chrome, Firefox, Safari, Edge) unterstützt. In älteren Firefox-Versionen feuerte das Ereignis teils nur am
TextTrack. Wer auf Nummer sicher gehen will, registriert amTextTrack.