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:
- ramka.html - Definicja dwóch ramek.
- dokument1.html - Zawartość pierwszej ramki. Znajdują się tam trzy przyciski, po kliknięciu których
wywoływana jest funkcja
Napis() zdefiniowana w drugim dokumencie. - dokument2.html - Zawartość drugiej ramki. W sekcji <BODY> znajduje się warstwa, natomiast w sekcji <HEAD> zdefiniowana jest funkcja
Napis() , która zmienia tekst na warstwie.
Funkcja
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.