Start · Sprachen · JavaScript · Referenz · Document.prerendering

Document.prerendering

Eigenschaft

Schreibgeschützter boolescher Wert, der <code>true</code> ist, solange das Dokument per Speculation Rules API im Hintergrund vorgerendert wird.

seit JavaScript Chrome/Edge 108+, Opera 94+; nicht in Firefox/Safa Kategorie: webapi

Signatur

get Document.prerendering

Beschreibung

Die Eigenschaft document.prerendering gibt true zurück, solange eine Seite vorgerendert wird. Das Vorrendern stößt der Browser an, zum Beispiel über die Speculation Rules API (<script type="speculationrules">) oder über eine Vorhersage aus der Adressleiste. Dabei lädt der Browser die Seite in einem unsichtbaren Hintergrund-Tab vollständig und führt auch ihr JavaScript aus. Sobald der Nutzer tatsächlich zu der Seite navigiert, wird sie aktiviert und fast ohne Verzögerung angezeigt. Ab diesem Moment ist prerendering false.

Gebraucht wird die Eigenschaft vor allem für Code, der erst laufen soll, wenn der Nutzer die Seite wirklich sieht. Dazu gehören Analyse- und Tracking-Aufrufe (Seitenaufrufe zählen), das Abspielen von Medien, Animationen, Werbeeinblendungen oder serverseitige Aktionen mit Nebenwirkungen. Solche Aufgaben verschiebt man bis zum Ereignis prerenderingchange, das beim Aktivieren der Seite genau einmal am document ausgelöst wird.

Wie lange die Aktivierung gedauert hat, lässt sich über PerformanceNavigationTiming.activationStart messen. Der Wert ist größer als 0, wenn die Seite vorgerendert wurde. So kann man auch nach der Aktivierung noch feststellen, ob es ein Vorrendern gab.

Rückgabewert

Typ
boolean
Beschreibung
true, solange das Dokument vorgerendert wird, sonst false. In Browsern ohne Unterstützung ist die Eigenschaft undefined.

Beispiele

Prüfen, ob die Seite gerade vorgerendert wird

if (document.prerendering) {
  console.log('Seite wird im Hintergrund vorgerendert');
} else {
  console.log('Seite ist sichtbar bzw. aktiviert');
}
Seite ist sichtbar bzw. aktiviert

Seitenaufruf erst nach der Aktivierung zählen

const trackPageView = () => {
  navigator.sendBeacon('/analytics', JSON.stringify({
    url: location.href,
    zeit: Date.now()
  }));
  console.log('Seitenaufruf gezählt');
};

if (document.prerendering) {
  // Warten, bis der Nutzer die Seite wirklich öffnet
  document.addEventListener('prerenderingchange', trackPageView, { once: true });
} else {
  trackPageView();
}
Seitenaufruf gezählt

Hilfsfunktion: Promise, das nach der Aktivierung erfüllt wird

const whenActivated = () => new Promise((resolve) => {
  if (document.prerendering) {
    document.addEventListener('prerenderingchange', () => resolve(), { once: true });
  } else {
    resolve();
  }
});

const init = async () => {
  await whenActivated();
  document.querySelector('video')?.play();
  console.log('Video gestartet');
};

init();
Video gestartet

Nachträglich erkennen, ob vorgerendert wurde

const [nav] = performance.getEntriesByType('navigation');
const wasPrerendered = document.prerendering || (nav?.activationStart ?? 0) > 0;

console.log(wasPrerendered ? 'vorgerendert' : 'normal geladen');
if (nav?.activationStart > 0) {
  console.log(`Aktiviert nach ${Math.round(nav.activationStart)} ms`);
}
normal geladen

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Bisher nur in Chromium-Browsern (Chrome/Edge ab 108). Firefox und Safari unterstützen die Eigenschaft nicht, dort ist sie undefined. Weil undefined als falsch gilt, funktioniert if (document.prerendering) trotzdem ohne zusätzliche Prüfung auf Unterstützung.
  • Verwechslungsgefahr: document.visibilityState ist beim Vorrendern zwar "hidden", das allein ist aber nicht aussagekräftig, weil auch Tabs im Hintergrund "hidden" melden. Das früher genutzte visibilityState === "prerender" ist veraltet.
  • Viele Analyse-Bibliotheken (z. B. Google Analytics) berücksichtigen das Vorrendern inzwischen selbst. Bei eigenen Lösungen muss man es selbst behandeln, sonst werden Seitenaufrufe gezählt, die der Nutzer nie gesehen hat.
  • Einige APIs werden während des Vorrenderns aufgeschoben oder blockiert, etwa Berechtigungsabfragen, alert(), Geolocation und Benachrichtigungen. Solche Aufrufe gehören hinter die Aktivierung.
  • Code mit Nebenwirkungen auf dem Server (z. B. Warenkorb ändern, Anmelden) sollte nie während des Vorrenderns laufen. Der Nutzer navigiert unter Umständen gar nicht zu der Seite.