Signatur
Beschreibung
Die schreibgeschützte Eigenschaft id der Schnittstelle NotRestoredReasons gibt den Wert des id-Attributs des <iframe>-Elements zurück, das das betreffende Dokument einbettet, z. B. "werbung" bei <iframe id="werbung" src="…">. Für das Dokument der obersten Ebene oder für einen iframe ohne id-Attribut ist der Wert null.
NotRestoredReasons-Objekte erhalten Sie über PerformanceNavigationTiming.notRestoredReasons. Sie erklären, warum eine Seite nicht aus dem Back/Forward-Cache (bfcache) wiederhergestellt wurde. Das Objekt der obersten Ebene beschreibt das Hauptdokument, und seine Eigenschaft children enthält für jeden eingebetteten iframe ein eigenes NotRestoredReasons-Objekt. Mit id (zusammen mit name und src) finden Sie heraus, welcher iframe den bfcache blockiert hat.
Praktisch ist das vor allem beim Monitoring echter Nutzerdaten (RUM): Sie senden die IDs der blockierenden Frames an Ihr Analyse-Backend und finden so problematische Drittanbieter-Einbettungen, etwa Widgets mit unload-Handlern oder offenen WebSocket-Verbindungen.
Rückgabewert
id-Attributs des einbettenden <iframe>. null beim Dokument der obersten Ebene oder wenn der iframe kein id-Attribut hat.Beispiele
IDs aller direkt eingebetteten iframes ausgeben
const [nav] = performance.getEntriesByType('navigation');
const gruende = nav?.notRestoredReasons;
if (gruende) {
// Oberste Ebene: id ist immer null
console.log('Hauptdokument-id:', gruende.id);
for (const kind of gruende.children ?? []) {
console.log(`iframe id=${kind.id ?? '(keine)'} blockiert=${kind.blocked}`);
}
} else {
console.log('Keine Daten (Seite aus bfcache oder API nicht unterstützt)');
}
Blockierende Frames rekursiv finden
const findeBlockierer = (nrr, pfad = []) => {
const bezeichner = nrr.id ?? nrr.name ?? nrr.src ?? 'top';
const aktuell = [...pfad, bezeichner];
const treffer = nrr.blocked
? [{ pfad: aktuell.join(' > '), gruende: nrr.reasons?.map((r) => r.reason) ?? [] }]
: [];
return treffer.concat(
(nrr.children ?? []).flatMap((kind) => findeBlockierer(kind, aktuell))
);
};
const [nav] = performance.getEntriesByType('navigation');
if (nav?.notRestoredReasons) {
console.table(findeBlockierer(nav.notRestoredReasons));
}
Blockierende iframe-IDs an das Monitoring senden
addEventListener('pageshow', () => {
const [nav] = performance.getEntriesByType('navigation');
const nrr = nav?.notRestoredReasons;
if (!nrr || nav.type !== 'back_forward') return;
const blockierendeIds = (nrr.children ?? [])
.filter((kind) => kind.blocked)
.map((kind) => kind.id)
.filter(Boolean);
navigator.sendBeacon('/rum/bfcache', JSON.stringify({
seite: location.pathname,
hauptBlockiert: nrr.blocked,
blockierendeIds
}));
});
// Wichtig · Fallstricke
- Browserunterstützung: Bisher nur in Chromium-Browsern (Chrome/Edge ab Version 123). Prüfen Sie vorher mit
'notRestoredReasons' in PerformanceNavigationTiming.prototypeoder optionaler Verkettung. - Häufig
null: Das Objekt der obersten Ebene hat immerid === null, genauso wie iframes ohneid-Attribut. Weichen Sie zur Identifikation aufnameodersrcaus. - Es wird das Attribut beim Laden gemeldet: Der Wert stammt aus dem Zustand des iframes zum Zeitpunkt der Navigation. Wird die
idspäter per Skript geändert, passt das nicht zwingend zum aktuellen DOM. - Ursprungsübergreifende iframes: Aus Datenschutzgründen werden bei fremden Ursprüngen Details wie
url,reasonsundchildrenzurückgehalten (null).id,nameundsrcsind aber weiterhin sichtbar, weil sie der einbettenden Seite ohnehin bekannt sind. notRestoredReasonsselbst istnull, wenn die Seite tatsächlich aus dem bfcache kam oder es sich nicht um eine Vor-/Zurück-Navigation handelte.