Przedstawimy działanie prostego skryptu, poznamy instrukcje warunkowe oraz problemy jakie stwarzają i jakie są wynikiem ich niedziałania. Oczywiście pokażemy też jak sobie radzić w takich sytuacjach.
Retrospekcja
Na początek przypomnimy sobie treść dokumentu
HTML z minimalną funkcjonalnością JavaScript – rozwinięcie rozszerzone treści newsa – patrz listing 1.
Strona z newsem
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque metus eros, rutrum at, hendrerit nec, posuere ac. wiecej
Vivamus pretium fringilla metus. Praesent a enim eu metus scelerisque tincidunt. In auctor lorem et leo.
Symulacja dziaĹania skryptu
DziÄki {html}document.getElementById(\’more\’){/html} pobraliĹmy
odnoĹnik do akapitu o {html}id=\”more\”{/html}. Przechowujemy
go w zmiennej o nazwie akapit. DziÄki
temu mamy miedzy innymi dostÄp do wszystkich
wĹaĹciwoĹci stylĂłw dla {html}
{/html}.
{stala}getElementById(id);{/stala}
Zapewne zastanawiajÄ
ce jest, co oznacza
w nazwie powyĹźszej funkcji sĹowo document
oraz kropka. By zrozumieÄ istotÄ problemu,
przeczytajmy to jak swoiste drzewo genealogiczne
(w kolejnych publikacjach dowiemy
siÄ, Ĺźe fachowa nazwa ma z nim wiele wspĂłlnego).
document jest tutaj rodzicem. Kropka
oznacza natomiast, Ĺźe {stala}getElementById(){/stala} jest
wĹasnoĹciÄ
rodzica. Po kropce moĹźe wystÄ
piÄ
rĂłwnieĹź jakaĹ zmienna, dla ktĂłrej document
jest rodzicem i ma do niej dostÄp.
Pora dodaÄ moĹźliwoĹÄ zwiniÄcia akapitu, czyli naleĹźy
ustawiÄ z powrotem display: none;
Programy, skrypty itp. reagujÄ
na nasze poczynania
w zaleĹźnoĹci od tego, co robimy. JeĹli skorzystamy
na przykĹad z funkcji wykop w serwisie
http://www.wykop.pl, strona \”wie\”, ze chcemy
usunÄ
Ä dany link i robi co trzeba.
To dziaĹanie moĹźna opisaÄ w nastÄpujÄ
cy sposĂłb: jeĹli uĹźytkownik
kliknie link, policz jego gĹos. Celowo
podkreĹliĹem sĹowo \”jeĹli\”, poniewaĹź na nim, tyle
ze w jÄzyku angielskim, opiera siÄ wiele operacji w JavaScripcie. CzÄsto bowiem bÄdziemy
uĹźywaÄ sĹowa if, chcÄ
c daÄ znak skryptowi, ze
jeĹli coĹ siÄ stanie, ten ma zareagowaÄ.
WracajÄ
c do naszego akapitu. Naszym celem
jest ponowne jego ukrycie. Ten, po pierwszym
klikniÄciu, ma styl {stala}display: block;{/stala}. Trzeba wiec
rozpoznaÄ, kiedy display jest rĂłwny \”block\” i wykonaÄ
jego zmianÄ na \”none\”.
Instrukcje warunkowe
PowyĹźszym sposobem do funkcji PokazAkapit,
znajdujÄ
cej siÄ w sekcji {html}{/html}, dodaliĹmy
nastÄpujÄ
cÄ
instrukcje warunkowa:
if (akapit.style.display == \"block\")
{
akapit.style.display = \"none\";
}
ZauwaĹźmy, ze caĹy czas opieramy siÄ na
zmiennej akapit, ktĂłra jest naszym odnoĹnikiem
do akapitu o {stala}id=\”more\”{/stala}. Dodany kod moĹźna
przetĹumaczyÄ tak:
JeĹli wĹaĹciwoĹÄ stylĂłw display jest rĂłwna
wartoĹci \”block\”, zmieĹ jÄ
na \”none\”.
{html}if (jakiĹ warunek) { wykonaj jakieĹ zadanie }{/html}
Konstrukcja ta, nazywana instrukcjÄ
warunkowÄ
, oznacza, Ĺźe jeĹli jakiĹ warunek bÄdzie prawdziwy,
wykona siÄ kod w klamrach.
{html}if (1 == 1) { alert (\’Jeden rĂłwna siÄ jeden!\’); }{/html}
JeĹli jeden rĂłwna siÄ jeden, wywoĹamy funkcjÄ {stala}alert();{/stala} o argumencie Jeden rĂłwna siÄ jeden.
1 == 1 to warunek. JeĹli jest on prawdziwy, wykonuje siÄ wszystko to, co jest zawarte w klamrach.
Ĺatwo moĹźna wywnioskowaÄ, Ĺźe jeĹli chcemy porĂłwnaÄ jakieĹ wartoĹci, wstawiamy miÄdzy nie ==
(dwa znaki \”rĂłwna siÄ\”). PorĂłwnywane wartoĹci mogÄ
byÄ zmiennymi, literami bÄ
dĹş cyframi. JeĹli
porĂłwnujemy litery, pamiÄtajmy, aby byĹy one otoczone cudzysĹowami lub apostrofami!
Problem…
WyprĂłbujmy teraz nasz skrypt, klikajÄ
c link wiÄcej.
Ups?! Nasz skrypt nie dziaĹa! Bez obaw – tak
wĹasnie powinno byÄ.
Aby wychwyciÄ bĹÄ
d, przeanalizujemy dziaĹanie
funkcji PokazAkapit, do ktĂłrej dodaliĹmy
przed chwila nowe elementy. Wszystko w JavaScripcie wykonuje siÄ w kolejnoĹci zapisania kodu, wiec interpretujemy go od gĂłry do doĹu
I tak, najpierw pobieramy odnoĹnik do naszego
akapitu z rozszerzona treĹciÄ
:
var akapit = document.getElementById A (\'more\');
NastÄpnie zmieniamy sposĂłb wyĹwietlania
akapitu:
akapit.style.display = \"block\";
Potem za pomocÄ
instrukcji warunkowej sprawdzamy
czy display akapitu ustawiony jest na block.
Jest to prawda, poniewaĹź przed chwila ostawiliĹmy
te wartoĹÄ. W takim razie wykona siÄ kod w klamrach,
bo warunek jest prawdziwy. W klamrach natomiast
mamy kod, ktĂłry zmienia display akapitu
z powrotem na none. DostaliĹmy wiec odpowiedz,
dlaczego klikajÄ
c wiÄcej, nic siÄ nie dziaĹo.
… i jego rozwiÄ zanie
RozwiÄ
zanie tego problemu jest po gĹÄbszym
przemyĹleniu bardzo logiczne. Musimy po klikniÄciu
linku wiÄcej rozwaĹźyÄ dwie sytuacje:
- kiedy akapit ma display rĂłwny block, po klikniÄciu
wiÄcej trzeba go zmieniÄ na none, - kiedy akapit ma display rĂłwny none, po klikniÄciu
wiÄcej trzeba go zmieniÄ na block.
JeĹli akapit jest schowany, pokaĹźemy go, jeĹli
akapit jest widoczny, ukrywamy go. TĹumaczÄ
c
to na JavaScript uzyskujemy nastÄpujÄ
cy kod:
function PokazAkapit()
{
var akapit = document.getElementById A
(\'more\');
var view = akapit.style.display;
if (view == \"block\")
{
akapit.style.display = \"none\";
}
if (view == \"none\")
{
akapit.style.display = \"block\";
}
}
W funkcji zaszĹy istotne zmiany. PojawiĹa siÄ
nowa zmienna o nazwie view. Przechowuje ona
display akapitu. Jak widaÄ, podstawiamy ja do
warunkĂłw. Wychodzi na to samo, poniewaĹź
zmienna view ma wartoĹÄ style.display akapitu,
czyli to o co nam chodziĹo. PorĂłwnujemy stronami
interesujÄ
ce nas wartoĹci przy uĹźyciu ==.
JeĹli ktĂłryĹ z warunkĂłw jest prawdziwy, zmieniamy
style.display akapitu.
PamiÄtajmy, Ĺźe nazwy zmiennych sÄ
dowolne.
RĂłwnie dobrze mogliĹmy uĹźyÄ nazwy babcia_jadzia, czy robertmateja0. W naszym przypadku jest to view, poniewaĹź przechowuje ona wartoĹÄ display akapitu – nazwa wydaje siÄ adekwatna.
Efekt koĹcowy
Nasz dokument zyskaĹ kolejna funkcjonalnoĹÄ
i wyglÄ
da juĹź coraz lepiej – patrz listing 2.
Strona z newsem
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque metus eros, rutrum at, hendrerit nec, posuere ac.wiecej
Vivamus pretium fringilla metus. Praesent a enim eu metus scelerisque tincidunt. In auctor lorem et leo.