Signatur
Beschreibung
TextTrackCue ist die gemeinsame Basis aller Cues, die zu einer TextTrack eines <video>- oder <audio>-Elements gehören. Ein Cue ist ein Eintrag mit Start- und Endzeit, zum Beispiel eine Untertitelzeile, ein Kapitelname oder ein Metadaten-Block.
Die Klasse ist abstrakt: new TextTrackCue() löst einen TypeError aus. In der Praxis erzeugen Sie VTTCue-Objekte (Untertitel, Kapitel, Metadaten) oder in Safari DataCue-Objekte. Die gemeinsamen Eigenschaften sind:
track: dieTextTrack, zu der der Cue gehört, odernullid: frei wählbare Kennung (entspricht der Cue-ID in WebVTT)startTime/endTime: Start- und Endzeit in Sekunden (double)pauseOnExit: wenntrue, pausiert die Wiedergabe am Ende des Cues
Zusätzlich löst jeder Cue die Events enter und exit aus, sobald die Wiedergabeposition den Cue betritt bzw. verlässt. So lassen sich zeitgesteuerte Aktionen umsetzen, etwa Quizfragen, Einblendungen oder synchronisierte Inhalte.
Rückgabewert
VTTCue.Beispiele
Cue über VTTCue erzeugen und einer Spur hinzufügen
const video = document.querySelector('video');
const track = video.addTextTrack('subtitles', 'Deutsch', 'de');
track.mode = 'showing';
// VTTCue erbt von TextTrackCue
const cue = new VTTCue(1.5, 4, 'Willkommen zum Tutorial!');
cue.id = 'intro';
track.addCue(cue);
console.log(cue instanceof TextTrackCue, cue.startTime, cue.endTime, cue.track === track);
enter- und exit-Events für zeitgesteuerte Aktionen
const video = document.querySelector('video');
const track = video.addTextTrack('metadata', 'Events');
track.mode = 'hidden'; // Events feuern, aber nichts wird angezeigt
const quizCue = new VTTCue(10, 15, JSON.stringify({ frage: 'Was ist ein Cue?' }));
quizCue.pauseOnExit = true; // Video stoppt nach 15 s
quizCue.addEventListener('enter', () => {
const { frage } = JSON.parse(quizCue.text);
console.log('Quiz einblenden:', frage);
});
quizCue.onexit = () => console.log('Quiz-Abschnitt beendet');
track.addCue(quizCue);
Alle Cues einer geladenen Spur auslesen
const trackEl = document.querySelector('track[kind="chapters"]');
trackEl.addEventListener('load', () => {
const { cues } = trackEl.track;
for (const cue of cues) {
console.log(`${cue.id || '-'}: ${cue.startTime}s–${cue.endTime}s`);
}
});
// Wichtig: mode darf nicht 'disabled' sein, sonst wird nichts geladen
trackEl.track.mode = 'hidden';
Abstrakte Klasse kann nicht instanziiert werden
try {
new TextTrackCue(0, 1);
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- Nicht instanziierbar:
new TextTrackCue()wirft einenTypeError. Verwenden SieVTTCue.DataCuegibt es derzeit nur in Safari. - Spur-Modus beachten: Ist
track.modeauf'disabled'gesetzt, sindcues/activeCuesnullundenter/exitfeuern nicht. Für unsichtbare Metadaten verwenden Sie'hidden'. - Ungenaues Timing: Die Events werden im Rahmen des Wiedergabe-Updates ausgelöst (typisch alle 15–250 ms). Bei sehr kurzen Cues oder beim Springen (Seeking) kann
enterverspätet kommen oder ganz ausfallen. - Ändern Sie
startTime/endTimeeines bereits hinzugefügten Cues, sortiert der Browser die Liste neu. Das Entfernen geschieht mittrack.removeCue(cue). - Sicherheit: Der Cue-Text kann aus fremden Quellen stammen. Fügen Sie ihn nie ungeprüft per
innerHTMLein, sondern verwenden SietextContentoderVTTCue.getCueAsHTML(). Externe.vtt-Dateien aus anderen Ursprüngen brauchen CORS und das Attributcrossoriginam Medienelement. - Die Unterstützung in modernen Browsern ist gut. Das Styling über
::cueist aber je nach Browser eingeschränkt.