Start · Sprachen · JavaScript · Referenz · IntersectionObserverEntry.time

IntersectionObserverEntry.time

Eigenschaft

Schreibgeschützter <code>DOMHighResTimeStamp</code> in Millisekunden, der angibt, wann die Schnittänderung relativ zum Zeitursprung des Dokuments erfasst wurde.

seit JavaScript Baseline: alle modernen Browser (seit 2019) Kategorie: webapi

Signatur

IntersectionObserverEntry.time

Beschreibung

Die schreibgeschützte Eigenschaft time eines IntersectionObserverEntry enthält einen DOMHighResTimeStamp. Er gibt in Millisekunden (mit Nachkommastellen) an, wann der Browser die Änderung der Schnittfläche zwischen Ziel- und Wurzelelement festgestellt hat. Gemessen wird relativ zum Zeitursprung des Dokuments, also auf derselben Zeitachse wie performance.now().

Nützlich ist der Wert vor allem, um Sichtbarkeitsdauern zu messen, etwa für Werbe-Impressionen („mindestens 1 Sekunde zu 50 % sichtbar“), für Lese-Analysen oder um Scroll-Verhalten auszuwerten. Da die Callbacks des Observers asynchron und gebündelt laufen, beschreibt time den tatsächlichen Zeitpunkt der Änderung genauer als ein performance.now(), das man erst im Callback aufruft.

Wenn ein Element sichtbar wird, merkt man sich den time-Wert. Wird es wieder unsichtbar, ergibt die Differenz der beiden Einträge die Sichtbarkeitsdauer. Beide Werte liegen auf derselben Zeitachse und lassen sich direkt voneinander abziehen.

Rückgabewert

Typ
DOMHighResTimeStamp (number)
Beschreibung
Zeitpunkt der Schnittänderung in Millisekunden relativ zu performance.timeOrigin. Der Wert kann Nachkommastellen haben.

Beispiele

Zeitpunkt einer Sichtbarkeitsänderung ausgeben

const target = document.querySelector('#hero');

const observer = new IntersectionObserver((entries) => {
  for (const entry of entries) {
    const status = entry.isIntersecting ? 'sichtbar' : 'unsichtbar';
    console.log(`${status} nach ${entry.time.toFixed(1)} ms`);
  }
});

observer.observe(target);
sichtbar nach 132.4 ms

Sichtbarkeitsdauer messen (z. B. für Lese-Analysen)

const visibleSince = new WeakMap();
const totalVisible = new WeakMap();

const observer = new IntersectionObserver((entries) => {
  for (const entry of entries) {
    if (entry.isIntersecting) {
      visibleSince.set(entry.target, entry.time);
    } else if (visibleSince.has(entry.target)) {
      const duration = entry.time - visibleSince.get(entry.target);
      const sum = (totalVisible.get(entry.target) ?? 0) + duration;
      totalVisible.set(entry.target, sum);
      visibleSince.delete(entry.target);
      console.log(`${entry.target.id}: ${Math.round(sum)} ms sichtbar`);
    }
  }
}, { threshold: 0.5 });

document.querySelectorAll('article').forEach((el) => observer.observe(el));
artikel-2: 4817 ms sichtbar

Werbe-Impression nach 1 Sekunde Sichtbarkeit zählen

const ad = document.querySelector('.ad-banner');
let startedAt = null;
let timer = null;

const observer = new IntersectionObserver(([entry]) => {
  if (entry.intersectionRatio >= 0.5) {
    startedAt = entry.time;
    // Restzeit ab dem echten Änderungszeitpunkt berechnen
    const elapsed = performance.now() - startedAt;
    timer = setTimeout(() => {
      console.log('Impression gezählt');
      observer.disconnect();
    }, Math.max(0, 1000 - elapsed));
  } else {
    clearTimeout(timer);
    startedAt = null;
  }
}, { threshold: [0, 0.5] });

observer.observe(ad);
Impression gezählt

// Wichtig · Fallstricke

  • Kein Unix-Zeitstempel: time ist relativ zum Zeitursprung des Dokuments. Für eine absolute Zeit verwendet man performance.timeOrigin + entry.time. Mit Date.now() lässt sich der Wert nicht direkt vergleichen.
  • Verzögerter Callback: Der Callback läuft oft deutlich später als entry.time, weil er gebündelt und mit niedriger Priorität ausgeführt wird. Für Zeitmessungen deshalb immer entry.time nehmen und nicht performance.now() im Callback.
  • Reduzierte Genauigkeit: Zum Schutz vor Timing-Angriffen (Spectre) runden oder verrauschen Browser hochauflösende Zeitstempel, besonders ohne Cross-Origin-Isolation. Die Werte sind also nicht mikrosekundengenau.
  • In iframes und Workern hat jedes Dokument seinen eigenen Zeitursprung. Werte aus verschiedenen Kontexten sind daher nicht direkt vergleichbar.
  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird ignoriert und löst im Strict Mode einen TypeError aus.
  • Kompatibilität: Chrome 51+, Firefox 55+, Safari 12.1+ und Edge 15+ unterstützen die Eigenschaft.