JavaScript Çerçeve Nesnesi (Frame Object)
Eskiden birden fazla sayfayı tek ekranda göstermek için frameset/frame çok kullanılırdı. Ancak modern web’de bu yaklaşım önerilmez. Bunun yerine genellikle CSS layout (grid/flex) veya gerekiyorsa iframe kullanılır.
Güncel Not
<frameset> ve <frame> etiketleri modern HTML standartlarında “deprecated” kabul edilir.
Yeni projelerde tercih etmeyin; mevcut eski projeleri anlamak için bilmek yeterli.
Eski Yöntem: frameset / frame (Sadece Tarihsel Bilgi)
Bir sayfayı sütunlara ayırıp iki ayrı HTML belgesini aynı anda göstermek için kullanılırdı. Aşağıdaki örnek, eski bir yaklaşımı gösterir.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Çerçeve Nesnesi (Eski)</title>
</head>
<frameset cols="20%,*">
<frame src="index.htm" name="cerceve1">
<frame src="index2.htm" name="cerceve2">
</frameset>
<noframes>
<body>
Tarayıcınız frame desteklemiyor.
</body>
</noframes>
</html>
Açıklama
cols="20%,*" sayfayı iki kolona böler: sol kolon %20, sağ kolon kalan alanı kaplar.
name="cerceve1" ve name="cerceve2" ile çerçevelere isim verilir.
Eski JS’te bu çerçevelere parent.frames[0] gibi erişilirdi.
Modern Alternatif: iframe ile Benzer Düzen
Eğer gerçekten ayrı bir sayfayı “gömme” ihtiyacınız varsa <iframe> kullanılır.
Aşağıdaki örnek frameset’in modern bir benzeridir.
<div style="display:flex; gap:12px;">
<iframe
src="index.htm"
title="Sol içerik"
style="width:20%; height:360px; border:1px solid #ddd;">
</iframe>
<iframe
src="index2.htm"
title="Sağ içerik"
style="flex:1; height:360px; border:1px solid #ddd;">
</iframe>
</div>
Püf Nokta
iframe içeriği başka bir domainden geliyorsa (cross-origin) JavaScript ile içerideki DOM’a doğrudan erişemezsiniz.
Böyle durumlarda
postMessage kullanılır.
İnce İpucu: parent / frames Mantığı (Eski Projeleri Okurken)
Eski projelerde çerçeveler genellikle şöyle çağrılırdı:
// Eski frame düzeninde:
parent.frames[0] // 1. çerçeve
parent.frames[1] // 2. çerçeve
// İsim verilmişse:
parent.frames["cerceve1"]
parent.frames["cerceve2"]
Dikkat
Cross-origin kısıtı frame/iframe fark etmeksizin geçerlidir.
Farklı domain içeriğine “script ile girip okumaya çalışmak” hata üretir.
Modern İletişim: postMessage (iframe ile güvenli haberleşme)
Farklı origin durumunda, parent ve iframe arasında mesajlaşma için standart yöntem budur.
// Parent sayfada:
const iframe = document.getElementById("myFrame");
iframe.contentWindow.postMessage({ type: "HELLO", payload: "Merhaba" }, "*");
window.addEventListener("message", (event) => {
// Güvenlik için origin kontrolü önerilir:
// if (event.origin !== "https://ornek.com") return;
if (event.data?.type === "REPLY") {
console.log("Iframe yanıt:", event.data.payload);
}
});
// Iframe içindeki sayfada:
window.addEventListener("message", (event) => {
if (event.data?.type === "HELLO") {
event.source.postMessage({ type: "REPLY", payload: "Mesaj alındı ✅" }, event.origin);
}
});
Özet
frameset/frameeski bir yöntemdir; yeni projelerde kullanmayın- Gerekirse
iframetercih edilir - Cross-origin erişim kısıtlıdır; iletişim için
postMessagekullanılır