Start · Sprachen · JavaScript · Referenz · LargestContentfulPaint.renderTime

LargestContentfulPaint.renderTime

Eigenschaft

Schreibgeschützter <code>DOMHighResTimeStamp</code>: der Zeitpunkt, zu dem das größte Inhaltselement (LCP-Kandidat) auf dem Bildschirm gerendert wurde.

seit JavaScript Chrome/Edge 77+, Firefox 122+; Safari: eingeschrän Kategorie: webapi

Signatur

LargestContentfulPaint.renderTime

Beschreibung

Die Eigenschaft renderTime eines LargestContentfulPaint-Eintrags gibt an, wann das Element tatsächlich gezeichnet wurde. Der Wert ist in Millisekunden relativ zu performance.timeOrigin angegeben, also ab dem Start der Navigation. Genau dieser Wert ist die Grundlage der Core-Web-Vitals-Metrik Largest Contentful Paint (LCP).

Du liest renderTime in der Regel über einen PerformanceObserver mit dem Eintragstyp "largest-contentful-paint" aus. Der Browser meldet während des Ladens mehrere Kandidaten, zum Beispiel erst eine Überschrift und später ein großes Hero-Bild. Der letzte gemeldete Eintrag vor der ersten Nutzereingabe gilt als endgültiger LCP-Wert.

Bei ursprungsfremden Bildern (andere Origin) ohne den HTTP-Header Timing-Allow-Origin kann renderTime aus Datenschutzgründen 0 sein. Neuere Browser liefern stattdessen einen vergröberten Wert. Für solche Fälle gibt es loadTime als Ersatzwert. startTime gibt bereits renderTime zurück, falls der Wert ungleich 0 ist, und sonst loadTime.

Rückgabewert

Typ
DOMHighResTimeStamp (number)
Beschreibung
Render-Zeitpunkt in Millisekunden relativ zu performance.timeOrigin. Kann 0 sein, wenn es sich um ein ursprungsfremdes Bild ohne Timing-Allow-Origin-Header handelt.

Beispiele

LCP-Kandidaten mit renderTime protokollieren

const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    console.log('LCP-Kandidat:', entry.element?.tagName, 'renderTime:', entry.renderTime.toFixed(1), 'ms');
  }
});

// buffered: true liefert auch Einträge, die vor der Registrierung entstanden sind
observer.observe({ type: 'largest-contentful-paint', buffered: true });
LCP-Kandidat: H1 renderTime: 412.3 ms LCP-Kandidat: IMG renderTime: 1187.6 ms

Ersatzwert loadTime bei ursprungsfremden Bildern

new PerformanceObserver((list) => {
  const entries = list.getEntries();
  const last = entries[entries.length - 1];

  // renderTime ist 0, wenn der Timing-Allow-Origin-Header fehlt
  const lcp = last.renderTime || last.loadTime;
  const quelle = last.renderTime ? 'renderTime' : 'loadTime (Ersatzwert)';

  console.log(`LCP: ${Math.round(lcp)} ms via ${quelle}`, last.url);
}).observe({ type: 'largest-contentful-paint', buffered: true });
LCP: 1350 ms via loadTime (Ersatzwert) https://cdn.example.com/hero.jpg

Endgültigen LCP-Wert an ein Analytics-Backend senden

let lcpWert = 0;

const po = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    lcpWert = entry.renderTime || entry.loadTime;
  }
});
po.observe({ type: 'largest-contentful-paint', buffered: true });

// Beim Verlassen bzw. Verstecken der Seite den letzten Kandidaten melden
addEventListener('visibilitychange', () => {
  if (document.visibilityState === 'hidden' && lcpWert > 0) {
    po.takeRecords().forEach((e) => { lcpWert = e.renderTime || e.loadTime; });
    po.disconnect();
    navigator.sendBeacon('/analytics/lcp', JSON.stringify({ lcp: Math.round(lcpWert), page: location.pathname }));
  }
}, { once: true });

// Wichtig · Fallstricke

  • Wert 0: Bei ursprungsfremden Bildern ohne den Header Timing-Allow-Origin: * (oder einen passenden Origin) kann renderTime 0 sein. Nimm dann loadTime oder startTime. Wenn du den CDN-Server kontrollierst, setze den Header, damit du genaue Werte bekommst.
  • Mehrere Kandidaten: Maßgeblich ist nur der letzte Eintrag, bevor der Nutzer die Seite bedient (Klick, Tastendruck) oder bevor die Seite in den Hintergrund wechselt. Scrollen allein beendet die Messung nicht in jedem Browser.
  • Hintergrund-Tabs: Wurde die Seite im Hintergrund geladen, ist der LCP-Wert verfälscht. Prüfe deshalb document.visibilityState bzw. den ersten visibilitychange.
  • Browser-Kompatibilität: Unterstützt in Chromium-Browsern (ab Version 77) und in Firefox ab Version 122. Safari hat die API lange nicht unterstützt. Prüfe daher vorher mit PerformanceObserver.supportedEntryTypes.includes('largest-contentful-paint').
  • Die Genauigkeit des Werts kann aus Sicherheitsgründen reduziert sein (Schutz vor Timing-Angriffen).