Start · Sprachen · JavaScript · Referenz · PerformanceSoftNavigation.paintTime

PerformanceSoftNavigation.paintTime

Eigenschaft

Liefert den Zeitstempel (<code>DOMHighResTimeStamp</code>), zu dem nach einer Soft Navigation die Rendering-Phase endete und die Paint-Phase begann.

seit JavaScript Experimentell: Chromium (Soft Navigations API, Ori Kategorie: webapi

Signatur

get PerformanceSoftNavigation.paintTime

Beschreibung

Die schreibgeschützte Eigenschaft paintTime gehört zur Schnittstelle PerformanceSoftNavigation aus der experimentellen Soft Navigations API. Eine Soft Navigation ist ein Seitenwechsel in einer Single-Page-Application: Die URL ändert sich per history.pushState() oder Navigation API, und der Inhalt wird per JavaScript ausgetauscht, ohne dass ein echtes Laden des Dokuments stattfindet.

paintTime gibt den Zeitpunkt an, zu dem der Browser nach dieser Navigation den Rendering-Schritt (Stil, Layout) abgeschlossen hat und mit dem Zeichnen (Paint) des ersten Frames beginnt. Der Wert stammt aus dem gemeinsamen PaintTimingMixin, das auch von anderen Paint-Einträgen genutzt wird. Er ist relativ zu performance.timeOrigin, also in derselben Zeitbasis wie startTime.

Praktisch nutzt man paintTime, um zu messen, wie lange eine clientseitige Routenänderung braucht, bis die Nutzerin oder der Nutzer das Ergebnis tatsächlich sieht – etwa als Differenz paintTime - startTime. Damit lassen sich Kennzahlen ähnlich wie First Paint auch für SPA-Navigationen erheben, was mit klassischen Navigation-Timing-Einträgen nicht möglich ist.

Im Unterschied zu presentationTime, das (sofern unterstützt) den Zeitpunkt angibt, zu dem die Pixel tatsächlich auf dem Bildschirm erscheinen, ist paintTime in allen Implementierungen verfügbar und plattformunabhängig vergleichbar.

Rückgabewert

Typ
DOMHighResTimeStamp
Beschreibung
Zeitstempel in Millisekunden (Gleitkommazahl) relativ zu performance.timeOrigin, zu dem die Paint-Phase des ersten Frames nach der Soft Navigation begann.

Beispiele

Soft Navigations beobachten und Zeit bis zum Paint messen

// Prüfen, ob der Browser den Eintragstyp kennt
if (PerformanceObserver.supportedEntryTypes?.includes('soft-navigation')) {
  const observer = new PerformanceObserver((list) => {
    for (const entry of list.getEntries()) {
      const bisPaint = entry.paintTime - entry.startTime;
      console.log(`Soft Navigation zu ${entry.name}: ${bisPaint.toFixed(1)} ms bis Paint`);
    }
  });
  // buffered: true liefert auch bereits erfolgte Einträge
  observer.observe({ type: 'soft-navigation', buffered: true });
} else {
  console.log('Soft Navigations API wird nicht unterstützt');
}
Soft Navigation zu https://example.com/produkte: 84.3 ms bis Paint

paintTime mit presentationTime vergleichen

const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    const { paintTime, presentationTime } = entry;
    // presentationTime ist nicht überall verfügbar
    if (presentationTime) {
      console.log(`Paint → Anzeige: ${(presentationTime - paintTime).toFixed(1)} ms`);
    } else {
      console.log(`Nur paintTime verfügbar: ${paintTime.toFixed(1)} ms`);
    }
  }
});
observer.observe({ type: 'soft-navigation', buffered: true });
Paint → Anzeige: 12.6 ms

Messwerte an ein Analytics-Backend senden

const sendeMetrik = (daten) => {
  navigator.sendBeacon('/analytics/soft-nav', JSON.stringify(daten));
};

new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    sendeMetrik({
      url: entry.name,
      navigationId: entry.navigationId,
      paintMs: Math.round(entry.paintTime - entry.startTime)
    });
  }
}).observe({ type: 'soft-navigation', buffered: true });

// Wichtig · Fallstricke

  • Experimentell: Die Soft Navigations API gibt es derzeit nur in Chromium-basierten Browsern hinter einem Flag bzw. als Origin Trial. Firefox und Safari unterstützen sie nicht. Vor der Nutzung immer mit PerformanceObserver.supportedEntryTypes.includes('soft-navigation') prüfen. Name und Form der Eigenschaften können sich noch ändern.
  • Eine Soft Navigation wird nur erkannt, wenn sie durch eine Nutzerinteraktion (z. B. Klick) ausgelöst wird, die URL ändert und das DOM sichtbar verändert. Programmatische URL-Wechsel ohne Interaktion erzeugen keinen Eintrag.
  • paintTime markiert den Beginn der Paint-Phase, nicht die tatsächliche Anzeige auf dem Bildschirm. Für den realen Anzeigezeitpunkt presentationTime verwenden, falls vorhanden.
  • Zur Wahrung der Privatsphäre und zum Schutz vor Timing-Angriffen werden Zeitstempel vom Browser gerundet (grober, ohne Cross-Origin-Isolation).
  • Einträge werden am besten per PerformanceObserver mit buffered: true gelesen; performance.getEntriesByType('soft-navigation') funktioniert je nach Implementierung ebenfalls.