Signatur
Beschreibung
TimeRanges.length liefert, wie viele getrennte, zusammenhängende Zeitbereiche ein TimeRanges-Objekt enthält. Solche Objekte bekommt man von Medienelementen (<audio>, <video>) über die Eigenschaften buffered, played und seekable sowie von SourceBuffer.buffered bei Media Source Extensions.
Die Eigenschaft ist die Grundlage, um über alle Bereiche zu iterieren: Gültige Indizes für start(index) und end(index) reichen von 0 bis length - 1. TimeRanges ist kein Array und nicht iterierbar – for...of, map() oder der Spread-Operator funktionieren nicht direkt. Man verwendet eine klassische for-Schleife bis length.
Typische Einsatzfälle sind die Anzeige eines Pufferfortschrittsbalkens, das Prüfen, ob eine bestimmte Position bereits geladen ist, oder die Statistik, welche Teile eines Videos tatsächlich angesehen wurden. Ein Wert von 0 bedeutet, dass (noch) kein Bereich vorhanden ist – etwa weil noch nichts gepuffert wurde.
Beispiele
Anzahl gepufferter Bereiche ausgeben
const video = document.querySelector('video');
video.addEventListener('progress', () => {
const { buffered } = video;
console.log(`Gepufferte Bereiche: ${buffered.length}`);
});
Alle Bereiche in ein Array umwandeln
const rangesToArray = (ranges) => {
const result = [];
for (let i = 0; i < ranges.length; i++) {
result.push({ start: ranges.start(i), end: ranges.end(i) });
}
return result;
};
const video = document.querySelector('video');
video.addEventListener('pause', () => {
console.table(rangesToArray(video.played));
});
Prüfen, ob eine Position bereits gepuffert ist
const isBuffered = (media, time) => {
const { buffered } = media;
for (let i = 0; i < buffered.length; i++) {
if (time >= buffered.start(i) && time <= buffered.end(i)) {
return true;
}
}
return false;
};
const video = document.querySelector('video');
console.log(isBuffered(video, 60)); // Sprung zu 1:00 ohne Nachladen möglich?
Pufferfortschritt in Prozent berechnen
const video = document.querySelector('video');
const bar = document.querySelector('#buffer-bar');
video.addEventListener('progress', () => {
const { buffered, duration } = video;
if (buffered.length === 0 || !Number.isFinite(duration)) return;
// Ende des letzten Bereichs als grobe Näherung
const loadedUntil = buffered.end(buffered.length - 1);
bar.style.width = `${(loadedUntil / duration) * 100}%`;
});
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung an
lengthwird ignoriert (im Strict ModeTypeError). - Leere Objekte: Bei
length === 0werfenstart(0)undend(0)eineIndexSizeError-DOMException. Vorher immerlengthprüfen. - Momentaufnahme: Ein
TimeRanges-Objekt ist nicht „live“. Nach neuen Ladevorgängen mussmedia.bufferederneut abgefragt werden, sonst liefertlengthveraltete Werte. - Nicht iterierbar:
Array.from(ranges)oderfor...offunktionieren nicht – eine Indexschleife bislengthverwenden. - Bereiche sind normalisiert: sie überlappen sich nicht und sind aufsteigend sortiert; angrenzende Bereiche werden vom Browser zusammengeführt.
- Kompatibilität: In allen modernen Browsern seit Langem unterstützt.