úadnie, no nie? A oto skrypt:
<html>
<head>
<script language="JavaScript">
<!-- Hide
function statbar(txt) {
window.status = txt;
}
// -->
</script>
</head>
<body>
<form>
<input type="button" name="look" value="Pisz!" onclick="statbar('Hej! To jest linia statusu!');">
<input type="button" name="erase" value="Wyma┐!" onclick="statbar('');">
</form>
</body>
</html>
Utworzyli╢my dwa przyciski i oba wywo│uj▒ funkcjΩ statbar(txt). Wyra┐enie 'txt'
wskazuje, ┐e funkcja otrzymuje pewn▒ zmienn▒ przekazan▒ jej podczas wywo│ania.
(Ja nazwa│em tΩ zmienn▒ po prostu txt - mo┐na by j▒ nazwaµ inaczej).
Je╢li przyjrzysz siΩ znacznikowi <form> w miejscu, gdzie definiowane
s▒ przyciski, dostrze┐esz ┐e jest tam wywo│ywana funkcja statbar(txt) .
Nie napisa│em tam jednak txt tylko poda│em tekst, kt≤ry ma zostaµ
umieszczony w linii statusu. Mo┐na to odczytaµ nastΩpuj▒co:
funkcja zostaje wywo│anaa a zmienna txt uzyskuje warto╢µ,
kt≤ra przekazana zostaje tej funkcji.
Po naci╢niΩciu przycisku 'Pisz!' wywo│ana zostaje funkcja
statbar(txt), a txt zawiera string 'Hej! To jest linia statusu'.
Taka metoda przekazywania zmiennych do funkcji jest bardzo elastyczna.
Sp≤jrz teraz na drugi przycisk. Wywo│uje on tΩ sam▒ funkcjΩ.
Gdyby╢my nie mogli przekazywaµ funkcjom pewnych parametr≤w, musieliby╢my
dla ka┐dego przypadku tworzyµ odrΩbn▒ funkcjΩ.
Co w│a╢ciwie robi statbar(txt) ? Jest to funkcja
do╢µ prosta. Przypisuje warto╢µ zmiennej txt zmiennej 'window.status'
czyli window.status = txt; .
Je╢li podany zostanie pusty string (''), to wiersz statusu zostanie
wyczyszczony. Zauwa┐, ┐e musieli╢my tu u┐yµ pojedynczych cudzys│ow≤w ('),
gdy┐ podw≤jne cudzys│owy (") u┐yte zosta│y do zdefiniowania 'onClick'.
Kompilator musi jednoznacznie rozpoznaµ zawarto╢µ ujΩt▒ cudzys│owami, dlatego te┐
trzeba by│o obu rodzaj≤w u┐yµ przemiennie. S▒dzΩ, ┐e to jest ca│kiem proste.
W│asno╢µ 'onMouseOver' znasz ju┐ z drugiej czΩ╢ci niniejszego podrΩcznika:
<a href="stupid.htm" onMouseOver="window.status='Jeszcze jeden g│upi odsy│acz ...';
return true">
Czy nie irytuje ciΩ, ┐e linia statusu nie zostaje wyczyszczona kiedy kursor
nie wskazuje ju┐ na ┐aden odsy│acz? Mam na to do╢µ prosty spos≤b. Napiszmy
niewielk▒ funkcjΩ, kt≤ra wykorzystuje tΩ sam▒ technikΩ wymazywania linii
statusu, kt≤r▒ przedstawili╢my wy┐ej.
Ale jak funkcja wymazuj▒ca ma byµ wywo│ana, skoro nie mamy metody
ani w│asno╢ci, kt≤ra pozwoli│aby nam dowiedzieµ siΩ, czy kursor myszki
opu╢ci│ odsy│acz. Rozwi▒zanie polega na ustawieniu timera.
Wypr≤bujmy nastΩpuj▒cy skrypt:
tu .
Przesu± tylko kursor - nie klikaj!
Posz│o do╢µ g│adko, prawda? Sp≤jrz tylko na kod ╝r≤d│owy - jest prostszy
ni┐ siΩ na pierwszy rzut oka wydawa│o.
<html>
<head>
<script language="JavaScript">
<!-- Hide
function moveover(txt) {
window.status = txt;
setTimeout("erase()",1000);
}
function erase() {
window.status="";
}
// -->
</script>
</head>
<body>
<a href="dontclck.htm" onMouseOver="moveover('Znika!');return true;">
link</a>
</body>
</html>
Wiele czΩ╢ci tego skryptu jest Ci ju┐ znanych. Funkcja moveover(txt)
jest funkcj▒ statbar(txt) poddan▒ operacji kopiuj/wklej! Prawie to
samo sta│o siΩ z funkcj▒ erase().
W obrΩbie dokumentu HTML (po znaczniku <body>) utworzyli╢my odsy│acz,
wykorzystuj▒c znan▒ ju┐ w│asno╢µ onMouseOver. Nasza funkcja moveover(txt)
wywo│ywana jest ze stringiem 'Znika!' przekazanym zmiennej txt -
tak samo jest w przypadku funkcji statbar(txt). Jedynie funkcja setTimeout(...)
jest nowa. Ustala ona timeout , czyli okre╢la, jak d│ugo timer
bΩdzie odlicza│ czas i co siΩ stanie, gdy limit czasu zostanie przekroczony.
W naszym przyk│adzie funkcja erase() jest wywo│ana po up│ywie 1000
milisekund (czyli po sekundzie, jak │atwo obliczyµ). To fantastystyczna cecha!
Funkcja moveover(txt) zostaje zako±czona po up│ywie ustalonego z g≤ry
czasu. Przegl▒darka automatycznie wywo│uje funkcjΩ erase()
po up│ywie 1 sekundy. (Mo┐na wyobraziµ sobie stronΩ, na kt≤rej m≤wi siΩ
siΩ u┐ytkownikowi: Je╢li nie zrobisz tego a tego, to tw≤j dysk twardy
zostanie zniszczony wci▒gu 10 sekund! )
Gdy mija ustalony okres, timer nie jest uruchamiany ponownie. Ale
mo┐e go uruchomiµ ponownie funkcja erase().
To prowadzi nas do powszechnie lubianych przewijaczy (scrollers) tekstu.
Je╢li wiesz ju┐, jak umie╢ciµ tekst w linii statusu i jak dzia│a funkcja
setTimeout - zrozumiesz │atwo, jak dzia│a przewijacz.
Naci╢nij ten przycisk, aby zobaczyµ m≤j przewijacz. Skrypt musi zostaµ
za│adowany z serwera, a wiΩc b▒d╝ cierpliwy, je╢li nie zobaczysz przewijacza
natychmiast.
Przyjrzyj siΩ skryptowi:
<html>
<head>
<script language="JavaScript">
<!-- Hide
var scrtxt="To jest wiadomo╢µ, na kt≤r▒ odwiedzaj▒cy twoj▒ stronΩ bΩd▒ "+
"patrzyli godzinami ca│kiem zafascynowani ...";
var lentxt=scrtxt.length;
var width=100;
var pos=1-width;
function scroll() {
pos++;
var scroller="";
if (pos==lentxt) {
pos=1-width;
}
if (pos<0) {
for (var i=1; i<=Math.abs(pos); i++) {
scroller=scroller+" ";}
scroller=scroller+scrtxt.substring(0,width-i+1);
}
else {
scroller=scroller+scrtxt.substring(pos,width+pos);
}
window.status = scroller;
setTimeout("scroll()",150);
}
//-->
</script>
</head>
<body onLoad="scroll();return true;">
Oto twoja odlotowa strona!
</body>
</html>
Skrypt ten wykorzystuje te same funkcje (lub ich czΩ╢ci ), kt≤rych u┐yli╢my
powy┐ej.
Funkcja setTimeout(...) 'm≤wi' timerowi, kiedy ma wywo│aµ funkcjΩ scroll().
Scroller przesunie tekst o krok dalej. Na pocz▒tku jest wiele
oblicze±, ale nie s▒ one zbyt wa┐ne dla zrozumienia, jak ten skrypt dzia│a.
Obliczenia s▒ potrzebne do ustalenie pozycji, od kt≤rej ma
siΩ zacz▒µ przesuwanie.
Powiedzia│em na pocz▒tku tej czΩ╢ci, ┐e przewijacze nie s▒ zbyt popularne,
albo - je╢li s▒ popularne - to wkr≤tce takimi nie bΩd▒. Ma to swoje
przyczyny. WymieniΩ tu kilka, ale jest ich z pewno╢ci▒ wiΩcej.
Je╢li zobaczysz przewijany tekst po raz pierwszy, efekt ten mo┐e Ci siΩ wydaµ do╢µ fajny. Kiedy jednak widzisz go ju┐ milion razy, to ju┐ taki fajny nie jest.
PrawdΩ m≤wi▒c nie jest to ca│kiem dobry argument, gdy┐ to samo mo┐na powiedzieµ prawie o ka┐dym ciekawszym triku, kt≤rego
u┐yjesz na swojej stronie.
S▒ jednak argumenty powa┐niejsze. Nie podoba mi siΩ to, ┐e zmienia siΩ prΩdko╢µ przesuwania tekstu. Je╢li ruszysz myszkΩ - tekst przyspiesza!.
Mnie w ka┐dym razie to dra┐ni. Ten efekt staje siΩ znacznie bardziej wyra╝ny, je╢li chc▒c uczyniµ przesuwanie szybszym, zmieni siΩ warto╢µ setTimeout.
Mo┐e znajdzie siΩ rozwi▒zanie tego problemu. Najgorsze jest jednak to, ┐e je╢li pozwolisz dzia│aµ swojemu skryptowi przez d│u┐szy czas, to otrzymasz komunikat Out of memory error . A to jest
do╢µ przykre. Jest to problem Netscape Navigatora 2.0. Byµ mo┐e w kolejnych wersjach ten b│▒d zostanie usuniΩty.
Jest jeszcze wiele innych procedur dostΩpnych w Sieci. Widzia│em przewijacze, kt≤re wypisuj▒ tekst do ramki. Programowanie takich efekt≤w nie jest
zbyt trudne.