Signatur
Beschreibung
Die Eigenschaft renderTime eines PerformanceElementTiming-Eintrags enthält den Zeitpunkt in Millisekunden relativ zu performance.timeOrigin, an dem das beobachtete Element auf dem Bildschirm dargestellt wurde. Beobachtet werden Bildelemente (<img>, <image> in SVG, Poster von <video>, CSS-Hintergrundbilder) und Textknoten, deren Element das Attribut elementtiming trägt.
Mit renderTime misst man, wann wichtige Inhalte für Nutzer sichtbar werden, etwa ein Hero-Bild, eine Hauptüberschrift oder ein Produktfoto. Anders als loadTime, das nur das Ende des Ladevorgangs einer Ressource angibt, beschreibt renderTime den tatsächlichen Zeitpunkt der Darstellung (Paint). Damit eignet sich die Eigenschaft gut für Real-User-Monitoring (RUM) und eigene, auf die Seite zugeschnittene Kennzahlen neben Largest Contentful Paint.
Die Einträge liest man mit einem PerformanceObserver vom Typ "element" aus. Mit buffered: true erhält man auch Einträge, die schon vor dem Registrieren des Observers entstanden sind.
Rückgabewert
performance.timeOrigin. Bei Cross-Origin-Bildern ohne passenden Timing-Allow-Origin-Header liefern ältere Implementierungen 0, neuere einen auf ganze Einheiten gerundeten, gröberen Wert.Beispiele
Renderzeit eines Hero-Bildes messen
// HTML: <img src="/hero.jpg" elementtiming="hero-image" alt="">
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (entry.identifier === 'hero-image') {
console.log(`Hero dargestellt nach ${entry.renderTime.toFixed(0)} ms`);
}
}
});
observer.observe({ type: 'element', buffered: true });
Fallback auf loadTime bei renderTime = 0
// Cross-Origin-Bild ohne Timing-Allow-Origin-Header
const getPaintTime = (entry) => entry.renderTime || entry.loadTime;
new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
console.log(entry.identifier, {
renderTime: entry.renderTime,
loadTime: entry.loadTime,
effektiv: getPaintTime(entry)
});
});
}).observe({ type: 'element', buffered: true });
Text-Renderzeit an ein Monitoring senden
// HTML: <h1 elementtiming="main-heading">Willkommen</h1>
if (PerformanceObserver.supportedEntryTypes?.includes('element')) {
new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
const payload = JSON.stringify({
metric: entry.identifier,
renderTime: Math.round(entry.renderTime),
tag: entry.element?.tagName
});
navigator.sendBeacon('/rum', payload);
}
}).observe({ type: 'element', buffered: true });
} else {
console.log('Element Timing wird nicht unterstützt');
}
// Wichtig · Fallstricke
- Browser-Kompatibilität: Element Timing gibt es nur in Chromium-basierten Browsern. Firefox und Safari unterstützen es nicht. Prüfe die Unterstützung vorher mit
PerformanceObserver.supportedEntryTypes.includes('element'). - Cross-Origin-Ressourcen: Ohne den Header
Timing-Allow-OriginistrenderTimeje nach Browserversion0oder bewusst ungenau. Verwende dannloadTimeals Ersatzwert oder setze den Header auf dem CDN. - Für Textknoten ist
loadTimeimmer0, dort zählt nurrenderTime. - Nur Elemente mit dem Attribut
elementtimingwerden gemeldet. Ohne Attribut entsteht kein Eintrag. Elemente, die erst nach einer Nutzerinteraktion dargestellt werden, sind oft nicht mehr erfasst. - Der Wert ist relativ zu
performance.timeOriginund keine Unix-Zeit. Für absolute Zeitangaben musst duperformance.timeOrigin + renderTimerechnen.