funkcja javascript ładująca strony do ramki
src istniejącego elementu <iframe> z poziomu JavaScript: function loadPageToIframe(url, iframeId = 'myFrame') {
const frame = document.getElementById(iframeId);
if (frame) frame.src = url;
}
<frameset> (HTML4) używa się obiektu parent.<nazwaRamki>.location.href = url, lecz ta technika jest przestarzała. Kluczowe punkty
• Stosuj iframe, nie frame/frameset (nie są wspierane w HTML5).
• Dodaj obsługę zdarzeń load/error, timeout i komunikaty o postępie.
• Zwróć uwagę na zabezpieczenia: Same-Origin Policy, nagłówki X-Frame-Options, CSP frame-ancestors.
function loadPageToIframe(url, iframeId = 'myFrame', opts = {}) {
const { timeout = 30000, onLoad = () => {}, onError = () => {} } = opts;
const frame = document.getElementById(iframeId);
if (!frame) throw new Error(`Brak <iframe id="${iframeId}">`);
return new Promise((resolve, reject) => {
const timer = timeout ? setTimeout(() => {
cleanup();
onError(new Error('Timeout'));
reject('Timeout');
}, timeout) : null;
function cleanup() {
frame.removeEventListener('load', hLoad);
frame.removeEventListener('error', hErr);
if (timer) clearTimeout(timer);
}
function hLoad() { cleanup(); onLoad(); resolve(url); }
function hErr(e) { cleanup(); onError(e); reject(e); }
frame.addEventListener('load', hLoad);
frame.addEventListener('error', hErr);
frame.src = url; // właściwe ładowanie
});
}
• Promise pozwala łatwo reagować na sukces/porażkę ładowania.
• Parametr timeout chroni przed „wiszącymi” żądaniami.
(rozbudowana wersja z odpowiedzi offline, skrócona)
class FrameManager {
constructor(id){ this.f = document.getElementById(id); this.h=[]; this.i=-1; }
async go(url){ await loadPageToIframe(url,this.f.id); this.h[++this.i]=url; }
back(){ if(this.i>0) this.f.src=this.h[--this.i]; }
forward(){ if(this.i<this.h.length-1) this.f.src=this.h[++this.i]; }
refresh(){ if(this.i>=0) this.f.src=this.h[this.i]; }
}
Daje podstawową nawigację bez przeładowywania całego widoku strony.
• iframe wprowadza osobny kontekst nawigacji, ale dziedziczy proces przeglądarki; dzięki temu zmiana tylko src nie resetuje skryptów rodzica.
• Sam JavaScript w ramce i w rodzicu może współpracować przy spełnionej zasadzie Same Origin lub poprzez mechanizm postMessage.
• Panel podglądu danych (np. dokumentacji PDF osadzonej w aplikacji).
• Osadzanie „ciężkich” usług (np. płatności, map, wideo).
• Mikrofirma SPA: dzielenie legacy-monolitu na moduły ładowane w iframe.
• Od 2021 r. większość przeglądarek wspiera natywny atrybut loading="lazy" dla iframe, co zmniejsza obciążenie:
<iframe id="myFrame" loading="lazy" width="100%" height="600"></iframe>
• Standard HTML Living wyraźnie dezaprobuje <frameset> – element zostaje usunięty z specyfikacji.
• Coraz częściej stosuje się fetch() + dynamiczny innerHTML lub biblioteki typu React/Angular do wczytywania widoków (SPA) zamiast osobnych dokumentów w ramkach.
Potencjalne przyszłe kierunki
• Declarative Shadow DOM i Web Components mogą całkowicie wyeliminować potrzebę klasycznego iframe w wielu aplikacjach.
• Nagłówek X-Frame-Options: DENY lub SAMEORIGIN uniemożliwi osadzenie danego zasobu.
• CSP frame-ancestors jest nowocześniejszym odpowiednikiem – serwer może podać listę dozwolonych domen-rodziców.
• postMessage – jedyna bezpieczna metoda komunikacji między różno-domenowymi ramkami.
// rodzic
frame.contentWindow.postMessage({cmd:'ping'}, '*');
// wewnątrz ramki
window.addEventListener('message', e=>{ if(e.data.cmd==='ping') ... });
• Osadzanie cudzych stron bez zgody może naruszać licencje lub prawa autorskie.
• Clickjacking – UI osadzony w ramce może wprowadzać użytkowników w błąd; rozwiązania: nagłówek X-Frame-Options, nakładka frame buster, polityka CSP.
• Dla treści podlegających RODO, przetwarzanie danych w ramce trzeciej strony wymaga odpowiednich umów powierzenia.
title (wymóg WCAG). opacity podczas load. sandbox z minimalnym zestawem uprawnień, gdy ładujesz obcy zasób: <iframe id="myFrame" sandbox="allow-same-origin allow-scripts"></iframe>
URL) zanim ustawisz src, aby uniknąć XSS przez przekierowanie do javascript:. • Brak możliwości modyfikacji DOM-u załadowanego z innej domeny (Same Origin).
• Niektóre przeglądarki mobilne ignorują loading="lazy" dla ramek powyżej określonego rozmiaru.
• Osadzanie ciężkich aplikacji (np. Google Maps) w wielu instancjach ramki może znacząco obciążyć pamięć.
• WebAssembly w ramkach – izolacja wydajnych modułów „micro-frontend”.
• Service Workers + Cache API jako alternatywa dla tradycyjnego iframe w aplikacjach offline-first.
• Zero-trust postMessage: biblioteki typu postmate, penpal zapewniają bezpieczną abstrakcję RPC między ramkami.
Polecane źródła
• MDN: „HTMLIFrameElement” & „Content Security Policy: frame-ancestors”.
• Google Web Fundamentals – Lazy-loading Images and Video (sekcja o iframe).
• OWASP Cheat Sheet – Clickjacking Defense.
Ustawienie iframe.src pozostaje najprostszym sposobem ładowania nowych stron do ramki. Należy jednak:
iframe, nie z przestarzałych frameset. load/error, wprowadzić timeout i walidację adresu. fetch, Web Components) – dają większą kontrolę i lepsze UX. Stosując się do powyższych zaleceń, otrzymasz stabilną, bezpieczną i nowoczesną funkcję ładowania stron w ramkach.