Ramki

Dokumenty umieszczone w ramkach mogą korzystać nawzajem ze swoich funkcji i zmiennych.
Aby uzyskać dostęp do innego dokumentu, należy skorzystać z obiektu parent, który reprezentuje okno nadrzędne, stanowiące szkielet ramek (frameset):

parent.frames["nazwa_ramki"]
lub
parent.nazwa_ramki

Na przykład, wywołanie funkcji zdefiniowanej w innym dokumencie

parent.nazwa_ramki.nazwa_fukcji();

lub odczytanie wartości zmiennej z innego dokumentu

wartosc=parent.nazwa_ramki.zmienna;

Przykład:

plik ramka.html - stanowiący definicję ramek

<html>
 <frameset cols="30%,70%">
  <frame src="dokument1.html" name="ramka1">
  <frame src="dokument2.html" name="ramka2">
 </frameset>
</html>

plik dokument1.html - zawartość pierwszej ramki

<html>
<body>
 <form>
  <input type="button" value="Klawisz 1"
  onclick="parent.ramka2.Napis(1)"><br><br>

  <input type="button" value="Klawisz 2"
  onclick="parent.ramka2.Napis(2)"><br><br>

  <input type="button" value="Klawisz 3"
  onclick="parent.ramka2.Napis(3)">
 </form>
</body>
</html>

plik dokument2.html - zawartość drugiej ramki

<html>
<head>
<script type="text/javascript">
function Napis(nr){
 //to jest funkcja zmieniająca napis na warstwie
 var napis=""

 //wybieramy napis
 if(nr==1)napis="Naciśnięty klawisz 1"
 if(nr==2)napis="A teraz klawisz 2"
 if(nr==3)napis="I ostatni klawisz 3"

 //piszemy na warstwie
 //Internet Explorer
 if(document.all)document.all.warstwa.innerHTML=napis
 //Netscape 4
 if(document.layers){
  document.layers.warstwa.document.open()
  document.layers.warstwa.document.write(napis)
  document.layers.warstwa.document.close()
 }

 //Netscape 6
 if(navigator.product=="Gecko")
  document.getElementById("warstwa").innerHTML=napis
}
</script>
</head>

<body>
<div id="warstwa" style="position:absolute">
To jest warstwa, na której ukazuje się różny tekst,
w zależności od tego, który klawisz zostanie przyciśnięty.
</div>
</body>
</html>

W powyższym przykładzie pokazane są kody źródłowe trzech plików:

Funkcja Napis() jest wywoływana w pierwszym dokumencie, pomimo że jej definicja znajduje się w drugim dokumencie. Jest to możliwe, ponieważ obydwa dokumenty znajdują się w ramkach, a funkcja jest wywoływana za pośrednictwem obiektu parent, który reprezentuje okno nadrzędne (ramka.html).
Aby zobaczyć przykład w działaniu kliknij tutaj.

Oprócz obiektu parent, mamy jeszcze do dyspozycji obiekt top. Obiekt ten ma zastosowanie w przypadku zagnieżdżenia ramek (ramki w ramce). W takim przypadku, obiekt parent reprezentuje bezpośredniego rodzica dokumentu, natomiast obiekt top reprezentuje frameset będący na samym szczycie w hierarchi ramek.
Jeżeli ramki nie mają swoich nazw, możliwy jest dostęp do nich na podstawie indeksu
parent.frames[0] - to pierwsza ramka
parent.frames[1] - to druga ramka itd.
Ponadto istnieje też właściwość parent.frames.length, na podstawie której możemy odczytać ilość ramek w dokumencie.

Często zdarza się, że ktoś umieszcza cudzą stronę w swojej ramce. Przyczyny mogą być dwie: nieumiejętne definowanie odnośników lub działanie celowe. Osoba ta chce stworzyć wrażenie, że strona (która nie jest jego dziełem) stanowi integralną część jego serwisu. Jeżeli mamy stronę, która nie jest w ramce i chcemy uniknąć takiej sytuacji, że ktoś umieszcza naszą stronę w swojej ramce, wystarczy wstawić do sekcji <head> prosty skrypt:

if(parent.frames.length!=0)
 parent.location.replace(location.href)

lub też inny skrypt

(top==self)||(top.location.replace(location.href))

Powyższy skrypt, możemy również umieścić w dokumencie z definicją ramek. Unikniemy w ten sposób sytuacji, że ktoś wczytuje do swojej ramki naszą stronę, na której już są ramki (a może to wyglądać dość nieszczególnie).

Jeżeli mamy stronę umieszczoną w ramce, to możemy sprawić, że będzie ona rozpoznawała tylko nasz frameset jako ten "właściwy". Najłatwiej uzyskać to poprzez próbę odczytania jakiejś właściwości unikalnej dla naszego framesetu np:

w sekcji <head> wstaw:

if(top.location.host=="Mój host")
 var frame_test=true

natomiast w sekcji <body> wstaw:

if(!frame_test)
 top.location.replace("adres_mojego_framesetu.html")

"Mój host" to nazwa serwera, subdomeny i domeny (bez protokołu http) np. "www.blatek.25.pl"
Należy jednak mieć na uwadze, że po zapisaniu takiej strony na dysku lokalnym i próbie jej otwarcia, nastąpi efekt zapętlenia. Strona będzie się bezustnnie przeładowywała.