Strona 1 z 1

wyswietlanie i ukrywabie obszarów

PostNapisane: 24 maja 2003, o 11:01
przez Artur
Witam!!
Chcę osiągnąc taki efekt:
po najechaniu myszką na obrazek- "menu_pliki/galeria.jpg" ma się pojawić tekst -id="warstwagal"
I taki skleciłem skrypt - (ale nie działa :cry: )

<style type="text/css">
#warstwagal{visibility: hidden;}
</style>
<script type="text/javascript">
<!--
var layerRef="", styleSwitch="";
function init (){
if (navigator.appName == "Netscape"){
var layerRef="document.layers";
var styleSwitch="";
}else{
var layerRef="document.all";
var styleSwitch=".style";
}
}

function pokazObszar(warstwagal){
eval(layerRef +'["'+warstwagal+'"]'+styleSwitch+'.visibility="visible"');
}
function ukryjObszar(warstwagal){
eval(layerRef +'["'+warstwagal+'"]'+styleSwitch+'.visibility="hidden"');
}
-->
</script>
<body onLoad="init()"
.....
....<tr>
<td valign="top" width="350" align="right"><a href="galeria.html"><img src="menu_pliki/galeria.jpg" border=0 style="filter:alpha(opacity=50)" onMouseover="high(this);pokazObszar()" onMouseout="low(this);ukryjObszar()" alt=" Galeria " ></a></td>
<td valign="top" width="350" align="left"><div id="warstwagal">Galeria MIERZEJEWSCY to ..... strona z myślą o naszych klientach prezentując nasze gusta i upodobania</div></td></tr>


...Co jest nietak ????
Pozdrawiam.
Artur

PostNapisane: 26 maja 2003, o 21:38
przez Wydra707
A w bardziej skomplikowany sposób nie dało się tego zrobić? ;-)

Uwaga: analizuję jedynie fragment dla IE. Zakładam też, że nie masz błędów w pozostałych funkcjach wywoływanych przez zdarzenia.

Błąd 1 - krytyczny:
Na początku skryptu inicjujesz zmienne, a następnie, wewnątrz funkcji init() inicjujesz je ponownie. Efekt jest taki, że tworzone są nowe zmienne lokalne layerRef i styleSwitch, które po zakończeniu funkcji init() znikają. Zmienne globalne layerRef i styleSwitch są przez cały czas puste i funkcje, które z nich korzystają nie działają. Usuń więc słowa var z wnętrza funkcji init(). Poza tym, nie widzę sensu, aby kontrola przeglądarki odbywała się dopiero po załadowaniu całej strony. To może być skrypt przetwarzany natychmiast, bo obiekt window tworzony jest jako pierwszy i w chwili uruchomienia skryptu na pewno będzie obecny.

Błąd 2 - krytyczny:
Funkcje pokazObszar() i ukryjObszar() wywołujesz bez żadnych parametrów, tymczasem w definicji tych funkcji podany jest oczekiwany parametr o nazwie warstwagal. W momencie gdy funkcja jest wywoływana, a parametr nie jest dostarczony, przyjmuje on wartość undefined i takie "coś" jest wyszukiwane w kolekcji all (co prowadzi do błędu). Powinieneś albo wywoływać te funkcje z parametrem będącym łańcuchem - nazwą identyfikatora docelowego obiektu:
onmouseover="pokazObszar('warstwagal')"
...albo usunąć ten parametr z funkcji i zamiast niego podstawić wprost łańcuch 'warstwagal' (jeśli funkcje nie muszą być uniwersalne):
eval(layerRef +'["warstwagal"]'+styleSwitch+'.visibility="visible"');

Błąd 3:
W funkcjach pokazObszar() i ukryjObszar() użyłeś za dużej ilości cudzysłowów. Jeśli zmienna warstwagal miałaby być wykorzystywana, to ona sama jest już łańcuchem i nie trzeba obejmować jej jeszcze jednym cudzysłowem:
eval(layerRef +'['+warstwagal+']'+styleSwitch+'.visibility="visible"');
Explorer jest tolerancyjny i jakoś daje sobie z tym błędem radę, choć nie powinien.

Poza tym, jeśli to możliwe, unikaj stosowania takich samych nazw zmiennych, jak identyfikatory obiektów - to może powodować problemy (ostatnio pisałem o tym w artykule o przyspieszaniu skryptów).

Po wprowadzeniu tych zmian Twoja funkcja zaczyna działać.

Pozdrawiam
Paweł Rajewski

PostNapisane: 27 maja 2003, o 19:28
przez Artur
:!: okej - działa po poprawkach :D
miałem chwilową zagwostkę jak przerobić to aby działało na innych obszarach.
Teraz kod wygląda tak:
<script type="text/javascript">
<!--
var layerRef="", styleSwitch="";
function init (){
if (navigator.appName == "Netscape"){
layerRef="document.layers";
styleSwitch="";
}
else{
layerRef="document.all";
styleSwitch=".style";
}
}

function pokazgal(warstwagal){
eval(layerRef +'['+warstwagal+']'+styleSwitch+'.visibility="visible"');
}
function ukryjgal(warstwagal){
eval(layerRef +'['+warstwagal+']'+styleSwitch+'.visibility="hidden"');
}
function pokazkontakt(warstwakontakt){
eval(layerRef +'['+warstwakontakt+']'+styleSwitch+'.visibility="visible"');
}
function ukryjkontakt(warstwakontakt){
eval(layerRef +'['+warstwakontakt+']'+styleSwitch+'.visibility="hidden"');
}
......function pokazInnaWarstwa(warstwaInnaWarstwa)
-->
</script>
Pozdrawiam.
Artur