Signatur
Beschreibung
window.frames ist eine schreibgeschützte Eigenschaft, die dasselbe Objekt wie window zurückgibt. Es gilt also window.frames === window. Das Fensterobjekt verhält sich dabei wie eine Liste: Über einen numerischen Index (frames[0], frames[1] …) erreichst du das WindowProxy-Objekt jedes direkten Unter-Frames. frames.length ist dasselbe wie window.length und gibt die Anzahl dieser Frames an.
Gezählt werden nur direkte Kinder, also <iframe>-, <frame>-, <object>- und <embed>-Elemente mit eigenem Browsing-Kontext, in der Reihenfolge, in der sie im Dokument stehen. Verschachtelte Frames erreichst du über frames[0].frames[0]. Du kannst Frames auch über ihren name-Wert ansprechen, z. B. frames["vorschau"].
Nützlich ist die Eigenschaft vor allem, wenn du Nachrichten an eingebettete Fenster schicken willst (postMessage), alle Frames durchlaufen möchtest oder bei gleichem Ursprung (same-origin) direkt auf das Dokument eines Frames zugreifen willst. Du bekommst hier Fensterobjekte zurück, keine DOM-Elemente. Das zugehörige <iframe>-Element findest du über document.querySelectorAll("iframe") bzw. aus Sicht des Frames über window.frameElement.
Rückgabewert
window.frames === window). Mit einem Index oder Namen darauf zugreifen liefert das WindowProxy des jeweiligen Unter-Frames oder undefined, wenn es keinen passenden Frame gibt.Beispiele
Alle direkten Frames durchlaufen
// Seite mit zwei <iframe>-Elementen
console.log(window.frames === window); // gleiches Objekt
console.log(`Anzahl Frames: ${frames.length}`);
for (let i = 0; i < frames.length; i++) {
const frameWin = frames[i];
try {
// Funktioniert nur, wenn der Frame denselben Ursprung hat
console.log(i, frameWin.location.href);
} catch (err) {
console.log(i, 'Fremder Ursprung – kein Zugriff');
}
}
Nachricht an alle eingebetteten Frames senden
// Theme-Wechsel an alle Widgets weitergeben
const broadcastTheme = (theme) => {
Array.from({ length: frames.length }, (_, i) => frames[i])
.forEach((win) => win.postMessage({ type: 'theme', theme }, 'https://widgets.example.com'));
};
broadcastTheme('dark');
Frame über name ansprechen und Frame-Element finden
// <iframe name="vorschau" src="/preview.html"></iframe>
const iframe = document.querySelector('iframe[name="vorschau"]');
iframe.addEventListener('load', () => {
const vorschau = frames['vorschau'];
console.log(vorschau === iframe.contentWindow);
// Same-origin: direkter DOM-Zugriff möglich
console.log(vorschau.document.title);
});
// Wichtig · Fallstricke
- Kein echtes Array:
frameshat wederforEachnochmap.Array.from(frames)klappt nicht zuverlässig, weilwindownicht iterierbar ist. Benutze eine Zählschleife mitframes.lengthoderArray.from({ length: frames.length }, (_, i) => frames[i]). - Same-Origin-Policy: Bei Frames mit fremdem Ursprung wirft der Zugriff auf
document,location.hrefusw. einenSecurityError. Nur wenige Dinge wiepostMessage(),locationneu setzen oderclose()sind erlaubt. Gib beipostMessageimmer einen konkreten Ziel-Ursprung statt"*"an und prüfe beim Empfangenevent.origin. - Ladezeitpunkt: Ein Frame taucht in
frameserst auf, wenn er im DOM hängt. Sein Inhalt ist aber vielleicht noch nicht geladen. Warte deshalb auf dasload-Event des<iframe>. - Die Reihenfolge folgt der Dokumentreihenfolge. Wenn du Frames per DOM-Manipulation einfügst oder entfernst, verschieben sich die Indizes.
- Das Attribut
sandboxkann den Zugriff auch bei gleichem Ursprung einschränken (ohneallow-same-origingilt der Frame als fremder Ursprung). - Die Eigenschaft wird von allen Browsern unterstützt.
<frame>/<frameset>sind in HTML5 veraltet, heute nutzt man<iframe>.