Professional Documents
Culture Documents
Head First JavaScript. Edycja Polska (Rusz Głową!)
Head First JavaScript. Edycja Polska (Rusz Głową!)
Edycja polska
Autor: Michael Morrison
Tumaczenie: Piotr Rajca
ISBN: 978-83-246-1548-3
Tytu oryginau: Head First JavaScript (Head First)
Format: 200x230, stron: 624
Spis treci
Wprowadzenie
19
31
61
111
159
211
263
307
359
407
10
461
11
495
12
545
Skorowidz
605
Wprowadzenie
Twj mzg koncentruje si na JavaScripcie. Siedzisz, prbujc si czego nauczy,
ale Twj mzg twierdzi, e caa ta nauka nie jest wana. Twj mzg twierdzi: Lepiej zostawi
miejsce na jakie wane rzeczy, takie jak to, ktrych dzikich zwierzt naley unika albo czy
jedenie nago na snowboardzie jest dobrym pomysem, czy nie. W jaki zatem sposb moesz
przekona swj mzg, by uzna, e poznanie JavaScriptu to dla Ciebie kwestia ycia lub mierci?
Dla kogo jest ta ksika?
20
21
Metapoznanie
23
25
Przeczytaj to
26
Zesp recenzentw
28
Podzikowania
29
Spis treci
Interaktywna WWW
32
33
A JavaScript odpowiada
34
36
41
42
45
46
47
Test
47
48
49
Dodanie powitania
50
52
53
54
57
58
Spis treci
Przechowywanie danych
6 z nadzieniem
3 z lukrem
Odbierze Grzesiek za
20 minut
62
63
68
72
73
74
78
79
80
84
86
89
90
92
93
94
98
99
100
105
Spis treci
Poznajemy klienta
W gb przegldarki
Czasami kod JavaScript musi wiedzie, co si dzieje w wiecie naokoo
niego. Twoje skrypty mog pocztkowo by tworzone jako kod umieszczany bezporednio
w stronach WWW, jednak w ostatecznoci i tak bd istnie i dziaa w wiecie kreowanym przez
przegldark WWW, nazywan take klientem. Sprytne skrypty czsto bd potrzeboway
pewnych informacji o wiecie, w ktrym yj; w takich sytuacjach mog zdoby te dane,
komunikujc si z przegldark. Niezalenie od tego, czy jest to okrelenie wymiarw ekranu,
czy te dostp do jakiego przycisku przegldarki, to utrzymujc dobre stosunki z przegldark,
skrypty mog bardzo wiele zyska.
Klienty, serwery i JavaScript
Tu zaczynamy!
Koniec!
112
114
116
118
119
120
121
125
126
127
128
129
133
134
136
137
138
143
145
146
147
148
150
152
155
Spis treci
Podejmowanie decyzji
160
162
163
165
166
167
170
171
172
178
179
181
182
186
187
188
190
191
193
194
195
Jedna z piciu
198
199
201
202
207
Spis treci
Ptle
Ryzykujc powtrzeniem
Niektrzy mwi, e powtrzenia to podstawa sukcesu. Oczywicie, e robienie
wci nowych i interesujcych rzeczy jest ekscytujce, lecz jednak codzienne ycie skada si
z czynnoci, ktre wielokrotnie powtarzamy. Maniakalne czyszczenie rk, nerwowe tiki bd
klikanie przycisku Odpowiedz wszystkim po odebraniu kadego dziwacznego lub miesznego
e-maila! No dobrze, moe w rzeczywistoci powtrzenia nie zawsze s takie znowu wspaniae.
Niemniej w wiecie JavaScriptu powtrzenia mog by niesychanie przydatne i uyteczne. Sam
nie wiesz, jak czsto pojawia si potrzeba kilkakrotnego wykonania pewnego fragmentu kodu
I wanie w takich sytuacjach w peni mona doceni zalety ptli. Gdyby nie one, musiaby
spdza bardzo duo czasu, wielokrotnie kopiujc i wklejajc ten sam fragment kodu.
Dostpne
X wskazuje miejsce
seat_avail.png
Zajte
Wybrane
seat_unavail.png
seat_select.png
10
212
213
214
215
216
217
218
Fotele s zmiennymi
219
220
221
Od JavaScriptu do HTML-a
225
226
231
232
233
Przerwa w dziaaniu
234
240
244
245
247
253
254
255
Dwuwymiarowe Mandango
257
260
Spis treci
Funkcje
264
266
267
268
271
272
273
274
277
279
281
282
283
287
288
289
290
291
292
293
297
298
299
300
303
11
Spis treci
ow
e
er
an
B
12
er y
ban
dniebne
lot po
la
ek
309
310
311
313
314
315
319
320
321
Wielko ma znaczenie
323
324
329
Weryfikacja daty
334
336
337
339
340
344
347
349
350
351
352
353
354
355
Spis treci
Document
html
body
""
"Stoisz
strong
""
head
360
361
363
364
369
370
373
376
Przygoda standaryzowana
381
383
384
385
386
387
388
Podmienianie stylw
389
Klasowe opcje
390
391
392
393
395
396
398
399
400
403
"sam"
13
Spis treci
Oywianie danych
Akcje
function prezentuj(co, kiedy, gdzie) {
...
Dane
var kto;
var co;
var kiedy;
}
function dostarcz(kto) {
...
}
var gdzie;
Obiekt
function prezentuj
(co, kiedy, gdzie) {
14
...
var kto;
var co;
var kiedy;
var gdzie;
}
function dostarcz(kto) {
...
}
JavaScriptowa impreza
408
409
410
411
415
416
Co jest w konstruktorze?
417
418
Potrzeba sortowania
423
424
Wyliczanie czasu
425
426
Obiekt w obiekcie
427
430
431
434
435
436
439
441
442
445
448
450
455
456
457
Spis treci
10
Blog
toString()
Ju mnie gowa
rozbolaa od zabaw
t now kostk... toHTML()
Klasa obiektu
16 sierpnia 2008
Blog
containsText()
Blog
462
Przecianie metod
463
Klasy i instancje
464
465
466
467
468
469
474
475
Podpisane i dostarczone
477
480
481
482
483
485
486
487
488
490
492
toString()
Znalazam
w internecie
ukadank 777. toHTML()
O rany! Zabawa
bdzie...
21 sierpnia 2008
Blog
containsText()
toString()
Spotkaam si
z kilkoma innymi
toHTML()
zapalecami,
by porozmawia
o ukadaniu...
29 sierpnia 2008
containsText()
15
Spis treci
11
16
496
497
498
501
505
Przetwarzajc wartoci IQ
507
508
Otwieranie dochodzenia
509
510
511
512
513
514
516
517
518
520
524
525
527
534
Bestiariusz JavaScriptu
535
538
540
Spis treci
Dynamiczne dane
12
<html>
<head>
...
</head>
<body>
...
</body>
</html>
youcube.html
<blog>
<title>...
<author>...
<entries>
<entry>
...
</entry>
...
</entries>
</blog>
blog.xml
546
547
549
550
553
555
558
560
563
567
571
572
573
574
579
Niedziaajce przyciski
581
582
585
586
588
590
593
598
599
600
Skorowidz
605
17
6. Funkcje
Pokj na wiecie
To jest naprawd
wielki problem!
Duy problem.
Mniejszy problem.
Poywienie
Uprawa
Dystrybucja
Prawa
obywatelskie
Schronienie
Prawa
do gruntw
Budownictwo
Wolno
wypowiedzi
Jeszcze mniejsz
y
problem.
Prawo do
gosowania
264
Rozdzia 6.
Funkcje
Schronienie
Budownictwo
Materiay
Narzdzia
Klimatyzacja
Najprostszy
z moliwych
klimatyzatorw
nacinij przycisk,
a urzdzenie zrobi,
co trzeba.
damy ogrzewania
Funkcje
przeksztacaj
due problemy
w mniejsze.
Temperatura si podnosi
heat();
damy ogrzewania
function heat() {
Temperatura si podnosi
Kady, kto chce wczy
ogrzewanie, musi wiedzie,
jak wywoa funkcj heat().
266
Rozdzia 6.
Funkcje
function
trz
Kod umieszczony wewn d
raw
nap
tak
t
jes
i
funkcj
onej,
czci instrukcji zo
rozpoczynajcej si tym
nawiasem klamrowym.
To jest identyfikator
zapisany wedug zasad
notacji lowerCamelCase.
Zaczynamy funkcj
od sowa kluczowego
function.
Nazwa
()
Ciao funkcji
Tu koczymy funkcj,
umieszczajc zamykajcy
nawias klamrowy.
Nawiasy wskazuj,
e mamy do
czynienia z funkcj.
function heat() {
// W jaki sposb zaczynamy ogrzewa
Tak naprawd
ogrzewanie jest
realizowane
wewntrz funkcji.
shovelCoal();
lightFire();
harnessSun();
}
WYT
UMYS
Wyszukiwanie
miejsc dla macho
Inicjalizacja
miejsc
Wyszukiwanie
miejsc
Duy problem
Mniejsze problemy
+ j)).src = "seat_avail.png";
+ j)).alt = "Miejsce dostpne";
+ j)).src = "seat_unavail.png";
+ j)).alt = "Miejsce zajte";
...
<img id="seat1" src="" alt="" />
/>
<img id="seat35" src="" alt="" /><br
ats();" />
value="Szukaj miejsc" onclick="findSe
<input type="button" id="findseats"
</div>
</body>
</html>
268
Rozdzia 6.
Funkcje
Nie ma
niemdrych pyta
Nazwa funkcji ma bardzo due znaczenie, gdy moe przekazywa informacje o jej przeznaczeniu. Sprbuj
wymyli nazwy dla opisanych poniej funkcji, pamitajc przy tym, by w odpowiedni sposb je zapisa.
wiczenie
Popro o fotel
przy przejciu
Popro o zwrot
kosztw
Odbierz bilet.
............................................
Odbierz
przyznane pienidze.
............................................
Wyrzu popcorn
Rozwizanie wiczenia
Nazwa funkcji ma bardzo due znaczenie, gdy moe przekazywa informacje o jej przeznaczeniu. Sprbuj
wymyli nazwy dla opisanych poniej funkcji, pamitajc przy tym, by w odpowiedni sposb je zapisa.
wiczenie
Rozwizanie Popro o fotel
przy przejciu
Popro o zwrot
kosztw
Odbierz bilet.
poprosOMiejscePrzyPrzejsciu()
................................................................
Odbierz
przyznane pienidze.
poprosOZwrot()
.................................................................
Wyrzu popcorn
Sss ale
milutko!
270
Rozdzia 6.
Funkcje
damy
ogrzewania
Temperatura
docelowa
Temperatura docelowa
jest informacj
wejciow przekazywan
do funkcji.
wiczenie
Temperatura
si podnosi
heat(targetTemp);
Napisz kod poprawionej funkcji heat(), ktra pobiera temperatur docelow i dziaa (czyli generuje ciepo)
wycznie wtedy, gdy temperatura zmierzona w danej chwili jest mniejsza od docelowej. Podpowied:
skorzystaj z hipotetycznej funkcji getTemp(), by okreli, jaka jest temperatura w danej chwili.
function heat(targetTemp)
.................................................................................................................................................................
Napisalimy
pierwszy wiersz
kodu, by uatwi
Ci rozwizanie
wiczenia.
.................................................................................................................................................................
.................................................................................................................................................................
.................................................................................................................................................................
.................................................................................................................................................................
.................................................................................................................................................................
Rozwizanie wiczenia
wiczenie
Rozwizanie
Napisz kod poprawionej funkcji heat(), ktra pobiera temperatur docelow i dziaa (czyli generuje ciepo)
wycznie wtedy, gdy temperatura zmierzona w danej chwili jest mniejsza od docelowej. Podpowied:
skorzystaj z hipotetycznej funkcji getTemp(), by okreli, jaka jest temperatura w danej chwili.
function heat(targetTemp)
.................................................................................................................................................................
Temperatura docelowa
while (getTemp() < targetTemp) {
jest przekazywana do .................................................................................................................................................................
funkcji jako argument
// W jaki sposb zaczynamy ogrzewa
.................................................................................................................................................................
jej wywoania.
Temperatura docelowa
shovelCoal();
jest uywana jako element
Obecnie funkcja
.................................................................................................................................................................
warunku sprawdzanego
generuje ciepo
w ptli while.
wycznie wtedy,
lightFire();
.................................................................................................................................................................
gdy aktualna
temperatura
harnessSun();
.................................................................................................................................................................
jest mniejsza
od temperatury
}
.................................................................................................................................................................
docelowej.
}
.................................................................................................................................................................
function
Nazwa
Argumenty
Ciao funkcji
ty
Wewntrz ciaa funkcji argumen
byy
y
gdyb
jak
tak,
ane
uyw
s
i.
zainicjowanymi zmiennymi lokalnym
272
Rozdzia 6.
Funkcje
heat(23);
23
function heat(targetTemp)
{
alert(targetTemp);
}
23
Kiedy wykonywanie
funkcji si zakoczy,
zmienna targetTemp
zostanie usunita.
targetTe
mp
Odejmujemy 1 od
aktualnej temperatury.
function coolIt(temperature)
{
temperature--;
}
Pomimo e
argument temp
jest modyfikowany
wewntrz funkcji,
to jednak zmienna
przechowujca
temperatur poza
funkcj pozostaje
niezmieniona.
Wyraenie obliczajce
cen biletu ze znik
jest niepotrzebnie
powtarzane.
zy o 20%
// Bilet dla dzieci jest tas
y * (1 0.20);
biletDzieciecy = biletNormaln
Funkcje
potrafi take
zwraca dane.
zy o 20%
// Bilet dla dzieci jest tas
etNormalny, 20);
(bil
izka
ZeZn
biletDzieciecy = cena
274
Rozdzia 6.
Funkcje
function findSeats() {
// Jeli jakie miejsce ju zostao wybrane, to ponownie inicjujemy
// wszystkie miejsca, by anulowa wczeniejszy wybr.
if (selSeat >= 0) {
selSeat = -1;
initSeats();
}
// Przegldamy wszystkie miejsca, poszukujc dostpnych
var i = 0, finished = false;
while (i < seats.length && !finished) {
for (var j = 0; j < seats[i].length; j++) {
// Sprawdzamy, czy aktualnie analizowane miejsce i dwa nastpne s dostpne
if (seats[i][j] && seats[i][j + 1] && seats[i][j + 2]) {
// Ustawiamy wybr i aktualizujemy wygld miejsca
selSeat = i * seats[i].length + j;
document.getElementById("seat + (i * seats[i].length + j)).src = "seat_select.png;
document.getElementById("seat + (i * seats[i].length + j)).alt = "Twoje miejsce;
document.getElementById("seat + (i * seats[i].length + j + 1)).src = "seat_select.png;
document.getElementById("seat + (i * seats[i].length + j + 1)).alt = "Twoje miejsce;
document.getElementById("seat + (i * seats[i].length + j + 2)).src = "seat_select.png;
document.getElementById("seat + (i * seats[i].length + j + 2)).alt = "Twoje miejsce;
// Prosimy uytkownika o zaakceptowanie wyboru miejsca
var accept = confirm("Miejsca od " + (j + 1) + " do " + (j + 3) +
" w rzdzie " + (i + 1) + " s wolne. Wybra je?);
if (accept) {
// Uytkownik zaakceptowa miejsce koczymy (wychodzimy z wewntrznej ptli)
finished = true;
break;
}
else {
// Uytkownik odrzuci wybr, zatem anulujemy wybr i szukamy dalej
selSeat = -1;
document.getElementById("seat + (i * seats[i].length + j)).src = "seat_avail.png;
document.getElementById("seat + (i * seats[i].length + j)).alt = "Miejsce dostpne;
document.getElementById("seat + (i * seats[i].length + j + 1)).src = "seat_avail.png;
document.getElementById("seat + (i * seats[i].length + j + 1)).alt = "Miejsce dostpne;
document.getElementById("seat + (i * seats[i].length + j + 2)).src = "seat_avail.png;
document.getElementById(seat + (i * seats[i].length + j + 2)).alt = Miejsce dostpne;
}
}
}
// Inkrementujemy licznik zewntrznej ptli
i++;
}
}
Rozwizanie wiczenia
function findSeats() {
// Jeli jakie miejsce ju zostao wybrane, to ponownie inicjujemy
// wszystkie miejsca, by anulowa wczeniejszy wybr.
if (selSeat >= 0) {
selSeat = -1;
initSeats();
}
// Przegldamy wszystkie miejsca, poszukujc dostpnych
var i = 0, finished = false;
while (i < seats.length && !finished) {
for (var j = 0; j < seats[i].length; j++) {
// Sprawdzamy, czy aktualnie analizowane miejsce i dwa nastpne s dostpne
if (seats[i][j] && seats[i][j + 1] && seats[i][j + 2]) {
// Ustawiamy wybr i aktualizujemy wygld miejsca
selSeat = i * seats[i].length + j;
document.getElementById("seat + (i * seats[i].length + j)).src = "seat_select.png;
document.getElementById("seat + (i * seats[i].length + j)).alt = "Twoje miejsce;
document.getElementById("seat + (i * seats[i].length + j + 1)).src = "seat_select.png;
document.getElementById("seat + (i * seats[i].length + j + 1)).alt = "Twoje miejsce;
document.getElementById("seat + (i * seats[i].length + j + 2)).src = "seat_select.png;
document.getElementById("seat + (i * seats[i].length + j + 2)).alt = "Twoje miejsce;
}
// Inkrementujemy licznik zewntrznej ptli
i++;
}
}
276
Rozdzia 6.
fragmenty kodu
powtarzaj si.
Moemy w nich
wyrni pewne
atrybuty
Funkcje
Numer miejsca
status bdzie
Numer miejsca, ktrego
nak indeks
ustawiany. Nie jest to jed
y od lewej do
tabeli, lecz numer liczon
zynajc od 0.
prawej i z gry w d, zac
Atrybuty funkcji
findSeats() zostay
wskazane poprzez
analiz powtarzajcego
si kodu, ktry
niebawem umiecimy
w nowej funkcji.
Chopie, funkcje
rzdz! Musimy ich
mie jak najwicej.
Status
Status miejsca. Moe on przyjmowa
wartoci: dostpne, zajte, wybrane.
Na jego podstawie okrelany jest
wywietlany na stronie obrazek miejsca.
Opis
e
Opis aktualnego statusu miejsca. Mo
, Miejsce
pne
dost
przyjmowa wartoci: Miejsce
lania
okre
do
y
zajte oraz Twoje miejsce. Su
zka
obra
entu
wartoci atrybutu alt elem
reprezentujcego dane miejsce.
Zaostrz owek
Napisz kod funkcji setSeat() dla aplikacji Mandango.
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
Zaostrz owek
Napisz kod funkcji setSeat() dla aplikacji Mandango.
Konkretne dane
zastosowane
w oryginalnym
kodzie zostay teraz
zastpione oglnymi
argumentami.
Nasza nowa
funkcja setSeat()
jest wywoywana
w szeciu miejscach.
278
Rozdzia 6.
Funkcje
function initSeats() {
// Inicjalizacja wygldu wszystkich miejsc
for (var i = 0; i < seats.length; i++) {
for (var j = 0; j < seats[i].length; j++) {
if (seats[i][j]) {
Dwa cakiem
// Okrelamy dostpne miejsce
= "seat_avail.png";
zoone wiersze
document.getElementById("seat" + (i * seats[i].length + j)).src
= "Miejsce dostpne";
kodu zostay
document.getElementById("seat" + (i * seats[i].length + j)).alt
zastpione
}
jednym
else {
stosunkowo
// Okrelamy zajte (niedostpne) miejsce
prostym
= "seat_unavail.png";
document.getElementById("seat" + (i * seats[i].length + j)).src
wywoaniem
;
zajte"
e
"Miejsc
=
j)).alt
+
h
].lengt
seats[i
*
document.getElementById("seat" + (i
funkcji.
}
function initSeats() {
}
// Inicjalizacja wygldu wszystkich miejsc
}
for (var i = 0; i < seats.length; i++) {
}
for (var j = 0; j < seats[i].length; j++) {
if (seats[i][j]) {
// Okrelamy dostpne miejsce
setSeat(i * seats[i].length + j, "avail", "Miejsce dostpn
e");
}
Poprzez uoglnienie operacji
sca
miej
usu
else
stat
{
okrelenia
// Okrelamy zajte (niedostpne) miejsce
funkcja setSeat() doskonale
si spisuje w bardzo rnych
setSeat(i * seats[i].length + j, "unavail", "Miejsce zajte"
);
sytuacjach
}
}
}
}
Jak zatem wida, stosunkowo prosta funkcja skadajca si z dwch wierszy kodu jest obecnie
wywoywana a w omiu miejscach kodu aplikacji Mandango. Nie tylko upraszcza to kod skryptu,
lecz take znacznie uatwia jego utrzymanie, gdy gdyby w przyszoci musia zmodyfikowa sposb
zmiany statusu miejsc, wystarczy zmieni go raz w kodzie funkcji setSeat() a nie w omiu
rnych miejscach caego skryptu. aden programista o zdrowych zmysach nie chciaby zmienia
kodu w omiu miejscach, jeli mgby tego unikn. atwo utrzymania fajna rzecz.
KLUCZOWE ZAGADNIENIA
Funkcje pozwalaj nam dzieli due problemy na mae,
dziki czemu mona je atwiej rozwiza.
Funkcje zapewniaj mechanizmy pozwalajce wydziela
zadania i implementowa je w postaci niezalenych
fragmentw kodu nadajcych si do wielokrotnego
stosowania.
Nie ma
niemdrych pyta
Ta
klimatyzacja nie
dziaa najlepiej
chyba zaraz zamarzn!
Ale
wspaniale
si dzi czuj!
Zima w lipcu
informacje zwrotne z funkcji
Cho aplikacja Mandango wiele zyskaa dziki zastosowaniu funkcji,
to jednak na froncie kontroli temperatury otoczenia funkcje nie radz
sobie ju a tak dobrze. Wyglda na to, e klimatyzator, ktrego kod
zosta napisany w JavaScripcie, wci nie dziaa prawidowo, a niektrzy
uytkownicy powoli zamarzaj, marzc o tym, by nacinicie przycisku
Ogrzewanie powodowao cige i nieprzerwane grzanie.
280
Rozdzia 6.
Funkcje
Wywietlacz Aktualna
temperatura pozwala
uytkownikom zorientowa
si, jaka jest aktualna
temperatura otoczenia,
dziki czemu s oni
w stanie dokadniej okreli
temperatur docelow.
Teraz nasz klimatyzator co pewien czas wywietla aktualn temperatur, pomagajc tym
samym uytkownikom nastawi optymaln temperatur, jak chcieliby uzyska.
dana
temperatura
Aktualna
temperatura
t
Funkcja getTemp() jes
u
cel
w
ana
yw
wywo
odczytania aktualnej
temperatury.
getTemp();
Wywietlana
jest aktualna
temperatura
Aktualna temperatura
jest zwracana jako wynik
dziaania funkcji.
WYT
UMYS
Jak sdzisz, w jaki sposb mona nakoni funkcj do zwrcenia jakich danych?
Zwracanie danych
Warto
pozwala zwraca
dane z funkcji do
kodu, ktry j
wywoa.
Zwracana warto
moe by dowolna.
function getTemp() {
// Odczyt i konwersja aktualnej temperatury
Dane odczytywane z czujnika
temperatury s podawane
w dziwacznym formacie, ktry
naley przeksztaci na warto
wyraon w stopniach.
function heat(targetTemp) {
while (getTemp() < targetTemp) {
// W jaki sposb zaczynamy ogrzewa
raca warto,
Funkcja getTemp() zw warunku
ktra jest uywana w ptli
sterujcym dziaaniem
w funkcji heat().
...
}
}
Warto wynikowa funkcji getTemp() zastpuje wywoanie tej funkcji i staje
si elementem warunku logicznego, sprawdzanego w ptli while.
282
Rozdzia 6.
Warto wynikowa
funkcji zastpuje jej
wywoanie.
Funkcje
function heat(targetTemp) {
if (getTemp() >= targetTemp)
return false;
while (getTemp() < targetTemp) {
// W jaki sposb zaczynamy ogrzewa
...
}
return true;
function heat(targetTemp) {
if (getTemp() >= targetTemp)
return;
while (getTemp() < targetTemp) {
// W jaki sposb zaczynamy ogrzewa
...
}
}
Instrukcji return
mona uywa do
przerywania dziaania
funkcji nawet bez
podawania wartoci
wynikowej.
jeste tutaj 283
284
Rozdzia 6.
Funkcje
wiczenie
Wyglda na to, e JavaScript zosta przyapany w samym centrum skandalu klimatyzacyjnego. Osoby
zrzeszone w ugrupowaniu Umiarkowani Krytycy Radykalnego Ocieplenia Powietrza, w skrcie: UKROP,
napisay skrypt goszcy ich ostrzeenie dotyczce lokalnego ocieplenia. Jednak czonkom ZAMIEC-i,
czyli Zrzeszenia Anonimowych Mionikw Inteligentnej Emisji Ciepa zagorzaym przeciwnikom
idei URKOP-u udao si dokona sabotau kodu tego skryptu. Twoim zadaniem jest wskazanie
prawidowych i sabotowanych fragmentw kodu oraz ujawnienie prawdziwych postulatw UKROP-u.
function showClimatMsg() {
return;
alert(constructMessage());
}
function constructMessage() {
var msg = "";
msg += "Globalne "; // "Lokalne "
if (getTemp() > 27)
msg += "ocieplenie ";
else
msg += "ochodzenie ";
if (true)
msg += "nie jest ";
else
msg = "jest ";
t
hmias
Natyc a
w
przer
e
lokaln e!
ni
e
l
ociep
Mioniczka
UKROP-u.
}
function getTemp() {
// Odczyt i konwersja aktualnej temperatury
var rawTemp = readSensor();
var actualTemp = convertTemp(rawTemp);
return 18;
}
Aktywista ZAMIEC-i.
Klim
och at si
nap adza
raw
d.
Rozwizanie wiczenia
wiczenie
Rozwizanie
Wyglda na to, e JavaScript zosta przyapany w samym centrum skandalu klimatyzacyjnego. Osoby
zrzeszone w ugrupowaniu Umiarkowani Krytycy Radykalnego Ocieplenia Powietrza, w skrcie: UKROP,
napisay skrypt goszcy ich ostrzeenie dotyczce lokalnego ocieplenia. Jednak czonkom ZAMIEC-i,
czyli Zrzeszenia Anonimowych Mionikw Inteligentnej Emisji Ciepa zagorzaym przeciwnikom
idei URKOP-u udao si dokona sabotau kodu tego skryptu. Twoim zadaniem jest wskazanie
prawidowych i sabotowanych fragmentw kodu oraz ujawnienie prawdziwych postulatw UKROP-u.
Ta instrukcja skutecznie
uniemoliwia wywietlenie
jakiegokolwiek komunikatu.
function showClimatMsg() {
return;
alert(constructMessage());
}
function constructMessage() {
var msg = "";
Ten kod jest
w porzdku,
gdy komunikat
zaley od
aktualnej
temperatury.
Instrukcja if,
ktrej warunek
jest zawsze
speniony, nie ma
wikszego sensu.
if (true)
msg += "nie jest ";
else
msg = "jest ";
if (getTemp() <= 21)
return msg + "bujd!";
else
return msg + "faktem!";
Instrukcja if/else
skutecznie uniemoliwi
dotarcie do tego miejsca
kodu, a zatem ta
instrukcja return jest
bezcelowa.
Musimy zwrci
faktyczn
temperatur
zmierzon przez
czujnik.
Dzikuj ci,
JavaScripcie!
function getTemp() {
// Odczyt i konwersja aktualnej temperatury
var rawTemp = readSensor();
var actualTemp = convertTemp(rawTemp);
return 18; actualTemp
}
286
Rozdzia 6.
Tutaj robi si
naprawd ciepo.
Pomocy!
Funkcje
Cae to
gadanie o temperaturze
i klimacie mocno mnie osabia.
Musz si zaj popraw mojej
aplikacji Mandango!
Miejsca s numerowane od
lewej do prawej i od gry do
dou, zaczynajc od numeru 0.
Numer
danie
miejsca
pobrania
statusu miejsca
Zostaje
zwrcony
status miejsca
Status
miejsca
getSeatStatus(seatNum);
Magnesiki z JavaScriptem
W kodzie funkcji getSeatStatus() brakuje kilku wanych elementw, ktre s jej niezbdne
do okrelenia statusu konkretnego miejsca. W pierwszej kolejnoci, funkcja sprawdza,
czy dane miejsce naley do sekwencji trzech, aktualnie wybranych miejsc. Jeli nie naley,
to funkcja sprawdza w tablicy miejsc czy dane miejsce jest dostpne czy nie. Uzupenij
brakujce miejsca kodu magnesikami widocznymi u dou strony.
function getSeatStatus(seatNum) {
if (
!= -1 && (
||
==
== (
+ 1) ||
return "Twoje";
else if (
[Math.floor(
[0].length)][
+ 2)))
== (
[0].length])
return "dostpne";
else
return "zajte";
}
seats
selSeat
seatNum
Magnesiki z JavaScriptem
W kodzie funkcji getSeatStatus() brakuje kilku wanych elementw, ktre s jej niezbdne do
okrelenia statusu konkretnego miejsca. W pierwszej kolejnoci, funkcja sprawdza, czy dane
miejsce naley do sekwencji trzech, aktualnie wybranych miejsc. Jeli nie naley, to funkcja
sprawdza w tablicy miejsc czy dane miejsce jest dostpne czy nie. Uzupenij brakujce miejsca
kodu magnesikami widocznymi u dou strony.
Mamy do czynienia z sekwencj trzech
miejsc pooonych obok siebie, zatem
musimy sprawdzi to miejsce i dwa
nastpne.
!= -1 &&
t ||
selSea...
( seatNum == ........
seatNum
... == (
seatNum == ( selSeat + 1) || ........
selSeat + 2)))
return "Twoje";
else if (
seats
[Math.floor( seatNum /
seats
[0].length)][ seatNum %
seats
[0].length])
return "dostpne";
else
return "zajte";
}
function showSeatStatus(seatNum) {
alert(To miejsce jest + getSeatStatus(seatNum) + .);
}
288
Rozdzia 6.
Funkcje
Funkcja
showSeatStatus()
zostanie wywoana,
gdy uytkownik kliknie
obrazek "seat23".
onclick!
KLUCZOWE ZAGADNIENIA
Polecenie return pozwala zwraca dane z funkcji do
kodu, ktry j wywoa.
Kiedy pewna informacja jest zwracana jako wynik
wykonania funkcji, to zastpuje ona jej wywoanie.
<html>
<head>
itle>
<title>Mandango - Wyszukiwarka miejsc dla prawdziwych mczyzn</t
<script type="text/javascript">
...
function initSeats() {
...
}
function getSeatStatus(seatNum) {
...
}
function showSeatStatus(seatNum) {
alert("To miejsce jest " + getSeatStatus(seatNum) + ".");
}
function setSeat(seatNum, status, description) {
status + ".png";
document.getElementById("seat" + seatNum).src = "seat_" +
;
document.getElementById("seat" + seatNum).alt = description
}
function findSeats() {
...
}
</script>
</head>
Na stronie
aplikacji
Mandango kod
JavaScript
przeplata
si z kodem
HTML.
290
<body onload="initSeats();">
<div style="margin-top:25px; text-align:center">
/>
<img id="seat0" src="" alt="" onclick="showSeatStatus(0);"
/>
<img id="seat1" src="" alt="" onclick="showSeatStatus(1);"
/>
<img id="seat2" src="" alt="" onclick="showSeatStatus(2);"
/>
s(3);"
owSeatStatu
<img id="seat3" src="" alt="" onclick="sh
/>
s(4);"
owSeatStatu
onclick="sh
alt=""
src=""
id="seat4"
<img
/>
s(5);"
<img id="seat5" src="" alt="" onclick="showSeatStatu
/>
s(6);"
owSeatStatu
onclick="sh
alt=""
src=""
<img id="seat6"
/>
<img id="seat7" src="" alt="" onclick="showSeatStatus(7);"
/><br />
s(8);"
owSeatStatu
onclick="sh
<img id="seat8" src="" alt=""
/>
<img id="seat9" src="" alt="" onclick="showSeatStatus(9);"
/>
s(10);"
owSeatStatu
<img id="seat10" src="" alt="" onclick="sh
/>
s(11);"
owSeatStatu
onclick="sh
alt=""
src=""
id="seat11"
<img
/>
s(12);"
<img id="seat12" src="" alt="" onclick="showSeatStatu
/>
s(13);"
owSeatStatu
onclick="sh
alt=""
<img id="seat13" src=""
/>
<img id="seat14" src="" alt="" onclick="showSeatStatus(14);"
/>
s(15);"
owSeatStatu
onclick="sh
<img id="seat15" src="" alt=""
/>
<img id="seat16" src="" alt="" onclick="showSeatStatus(16);"
/><br />
s(17);"
owSeatStatu
<img id="seat17" src="" alt="" onclick="sh
/>
s(18);"
owSeatStatu
onclick="sh
alt=""
src=""
<img id="seat18"
/>
<img id="seat19" src="" alt="" onclick="showSeatStatus(19);"
/>
s(20);"
owSeatStatu
onclick="sh
alt=""
<img id="seat20" src=""
/>
<img id="seat21" src="" alt="" onclick="showSeatStatus(21);"
/>
s(22);"
owSeatStatu
<img id="seat22" src="" alt="" onclick="sh
/>
<img id="seat23" src="" alt="" onclick="showSeatStatus(23);"
/>
s(24);"
<img id="seat24" src="" alt="" onclick="showSeatStatu
/>
s(25);"
owSeatStatu
onclick="sh
alt=""
src=""
<img id="seat25"
/><br />
<img id="seat26" src="" alt="" onclick="showSeatStatus(26);"
/>
s(27);"
owSeatStatu
onclick="sh
alt=""
<img id="seat27" src=""
/>
<img id="seat28" src="" alt="" onclick="showSeatStatus(28);"
/>
s(29);"
owSeatStatu
<img id="seat29" src="" alt="" onclick="sh
/>
<img id="seat30" src="" alt="" onclick="showSeatStatus(30);"
/>
s(31);"
<img id="seat31" src="" alt="" onclick="showSeatStatu
/>
s(32);"
owSeatStatu
onclick="sh
alt=""
src=""
<img id="seat32"
/>
<img id="seat33" src="" alt="" onclick="showSeatStatus(33);"
/>
s(34);"
owSeatStatu
onclick="sh
alt=""
<img id="seat34" src=""
/><br />
<img id="seat35" src="" alt="" onclick="showSeatStatus(35);"
ndSeats();" />
onclick="fi
miejsc"
aj
value="Szuk
<input type="button" id="findseats"
</div>
</body>
</html>
Rozdzia 6.
Widz tu
wymieszanych
wiele rodzajw
kodu.
Funkcje
Zawarto
<html>
...
</html>
Rozdzielenie zawartoci,
prezentacji i funkcjonalnoci
sprawia, e duy problem
jest rozkadany na kilka
mniejszych.
Funkcjonalno
<script>
...
</script>
Prezentacja
<style>
...
</style>
Separacja
funkcjonalnoci od
zawartoci uatwia
tworzenie aplikacji
internetowych oraz ich
pniejsze utrzymanie.
WYT
UMYS
Dane = funkcje
function showSeatStatus(seatNum) {
alert("To miejsce jest " + getSeatStatus(seatNum) + ".");
}
Ten kod dziaa bardzo dobrze, jednak t sam funkcj
mona utworzy take w inny sposb:
var showSeatStatus
= function(seatNum) {
292
Rozdzia 6.
Funkcje
alert(myShowSeatStatus(23));
showSeatStatus
function() {
...
myShowSeatStatus
Tak naprawd
funkcja jest
jedynie zmienn,
ktrej wartoci
jest odwoanie
do ciaa funkcji.
Zapisanie w zmiennej
myShowSeatStatus odwoania
do funkcji.
Przeanalizuj przedstawiony poniej fragment kodu i zapisz liczb, ktra zostanie wywietlona w okienku dialogowym.
wiczenie
function doThis(num) {
return num++;
}
function doThat(num) {
return num--;
}
var x = doThis(11);
var y = doThat;
var z = doThat(x);
x = y(z);
y = x;
alert(doThat(z y));
Rozwizanie wiczenia
Przeanalizuj przedstawiony poniej fragment kodu i zapisz liczb, ktra zostanie wywietlona w okienku dialogowym.
wiczenie
Rozwizanie
function doThis(num) {
return num++;
}
function doThat(num) {
return num--;
}
var x = doThis(11);
var y = doThat;
var z = doThat(x);
x = y(z);
y = x;
alert(doThat(z y));
x = 12
y = doThat
z = doThat(12) = 11
x = doThat(11) = 10
y = 10
alert(doThat(11 10))
Nie ma
niemdrych pyta
294
Rozdzia 6.
: W odrnieniu od normalnych
zmiennych, ktre przechowuj
powizane z nimi dane jako wartoci
w pamici, funkcje przechowuj
odwoania do swego kodu. A zatem
wartoci zmiennej funkcyjnej nie
jest sam kod funkcji, lecz odwoanie
do miejsca w pamici, w ktrym ten
kod si znajduje. Zatem w przypadku
funkcji zmienna przypomina nieco
adres pocztowy, ktry wskazuje, o jaki
dom chodzi, lecz nie jest tym domem.
Funkcje wykorzystuj odwoania,
a nie faktyczne wartoci, gdy
rozwizanie to jest bardziej efektywne
ni tworzenie i przechowywanie wielu
kopii kodu. A zatem przypisujc
funkcj procedurze obsugi
zdarze (co niebawem) zrobisz,
w rzeczywistoci przypisujesz jedynie
odwoanie do jej kodu, a nie sam kod.
Funkcje
WYT
UMYS
Jak sdzisz, czy takie funkcje zwrotne mogyby si przyda w aplikacji Mandango?
Jeli tak, to w jaki sposb mona by je wykorzysta?
Funkcja normalna:
Funkcja zwrotna:
296
Rozdzia 6.
Funkcje
Przegldarka wywouje
funkcj initSeats() po
zakoczeniu wczytywania
strony.
onload!
initSeats();
onclick!
showSeatStatus(23);
<body onload="initSeats();">
Czy mog
oddzwoni?
window.onload = initSeats;
zostaje
Odwoanie do funkcji initSeats()
ad.
onlo
ci
ciwo
wa
we
zapisane
Jak zatem wida, okrelenie procedury obsugi zdarze z poziomu kodu JavaScript
polega na zapisaniu odwoania do funkcji w odpowiedniej waciwoci odpowiedniego
obiektu. W powyszym przykadzie przypisanie odwoania do funkcji we waciwoci
onload sprawi, e kade zgoszenie zdarzenia onload spowoduje wywoanie funkcji
initSeats(). Co wicej, wywoanie funkcji nastpuje automatycznie w odpowiedzi na
zgoszenie zdarzenia. Oto, jak wyglda ten proces:
window.onload();
onload!
initSeats();
a poniewa we waciwoci
tej zostao zapisane odwoanie
do funkcji, zatem w celu obsugi
zdarzenia onload zostanie wywoana
funkcja initSeats().
<body>
W kocu znacznik <body> moe pozosta znacznikiem <body>, gdy funkcja obsugujca
zdarzenia onload zostaa okrelona z poziomu kodu JavaScript. Musimy tylko zadba
o to, by kod okrelajcy funkcj obsugujc zdarzenia zosta wykonany moliwie jak
najwczeniej; dlatego te zazwyczaj jest on umieszczany w sekcji nagwka strony.
Jest jednak pewien problem. Co zrobi, gdy do funkcji obsugujcej zdarzenia musimy
przekaza jaki argument, konieczny do jej prawidowego wykonania? Problem ten
nie wystpuje w przypadku zdarze onload uywanych w aplikacji Mandango, jednak
prawidowe obsuenie zdarzenia onclick wymaga ju przekazania argumentu numeru
kliknitego miejsca. Odwoania do funkcji nie umoliwiaj przekazywania argumentw
a zatem musimy przyjrze si temu zagadnieniu dokadniej.
298
Rozdzia 6.
Odwoania
zapewniaj
wygodny sposb
powizania funkcji
ze zdarzeniami,
ktre te funkcje
maj obsugiwa.
Funkcje
onclick!
a fotela, aby
Pobieramy obiekt obrazk
waciwoci
o
jeg
do
uzyska dostp
onclick.
document.getElementById("seat23").onclick = function(evt) {
showSeatStatus(23);
};
Litera funkcyjny zawiera wywoanie
metody showSeatStatus(), dziki
czemu moemy przekaza do niej
argument.
Litera funkcyjny
jest zapisywany we
waciwoci onclick jako
odwoanie do funkcji.
wiczenie
e
Obiekt zdarzenia jest automatyczni
ugi
obs
y
edur
proc
do
y
wan
przekazy
jej
zdarze jako pierwszy argument
wywoania.
Literay funkcyjne
pozwalaj nam tworzy
anonimowe funkcje
obsugujce zdarzenia.
Skojarz funkcj initSeats() z procedur obsugi zdarze onload, uywajc do tego celu literau funkcyjnego,
a nie odwoania do funkcji.
...............................................................................................................................
...............................................................................................................................
...............................................................................................................................
Rozwizanie wiczenia
Skojarz funkcj initSeats() z procedur obsugi zdarze onload, uywajc do tego celu literau funkcyjnego,
a nie odwoania do funkcji.
wiczenie
window.onload = function(evt) {
Rozwizanie ...............................................................................................................................
initSeats();
...............................................................................................................................
};
...............................................................................................................................
Funkcja initSeats() jest
wywoywana wewntrz literau
funkcyjnego obsugujcego
zdarzenie onload.
Kod obsugujcy
zdarzenie onload
jest doskonaym
miejscem do
okrelenia procedur
obsugi wszelkich
innych zdarze.
...
// Inicjalizacja prezentacji
initSeats();
}
300
Rozdzia 6.
Funkcje
Nie ma
niemdrych pyta
Zaostrz owek
Uzupenij brakujcy kod nowej wersji procedury obsugi zdarzenia onload aplikacji Mandango.
window.onload = function() {
miejsc
// Skojarzenie procedury obsugi kliknicia przycisku Szukaj
;
.......
.......
=
.......
document.getElementById("findseats")......
// Skojarzenie procedury obsugi kliknicia
document.getElementById("seat0")..........
document.getElementById("seat1")..........
document.getElementById("seat2")..........
obrazka miejsca
= function(evt){.............};
= function(evt){.............};
= function(evt){.............};
...
// Inicjalizacja prezentacji
..........
}
Rozwizanie wiczenia
Zaostrz owek
Rozwizanie
Uzupenij brakujcy kod nowej wersji procedury obsugi zdarzenia onload aplikacji
Mandango.
Funkcja findSeats() jest kojarzona
ze zdarzeniem onclick przy uyciu
odwoania do funkcji.
window.onload = function() {
miejsc
// Skojarzenie procedury obsugi kliknicia przycisku Szukaj
ts
findSea
onclick
;
.......
document.getElementById("findseats")............. = .......
// Skojarzenie procedury obsugi kliknicia obrazka miejsca
showSeatStatu
onclick
....};
.......s(0);
.......
document.getElementById("seat0").......... = function(evt){
s(1);
atStatu
showSe...........};
onclick
.......
document.getElementById("seat1").......... = function(evt){
showSeatStatu
....};
.......s(2);
onclick
.......
document.getElementById("seat2").......... = function(evt){
...
// Inicjalizacja prezentacji
initSeats();
...
.......
}
KLUCZOWE ZAGADNIENIA
Funkcje zwrotne s wywoywane przez przegldark
w odpowiedzi na zdarzenia zachodzce poza skryptem.
Odwoa do funkcji mona uywa do przypisywania
funkcji w taki sposb, jak gdyby byy zwyczajnymi
zmiennymi.
302
Rozdzia 6.
Funkcje
Nie ma
niemdrych pyta
O: Poniewa nie ma powodu tworzy w tym celu zwyczajnej, O: Tak. Moesz sdzi, e nic nie stoi na przeszkodzie, by
nazwanej funkcji. Funkcja ta jest wywoywana tylko raz
w odpowiedzi na zdarzenie onload. Oczywicie nic nie stoi na
przeszkodzie, bymy utworzyli zwyczajn funkcj i przypisali
odwoanie do niej we waciwoci window.onload; jednak
powizanie pomidzy zdarzeniem i funkcj zwrotn jest
bardziej czytelne i zrozumiae w przypadku uycia literau
funkcyjnego ni odwoania do funkcji.
Chopie,
musz zrobi
zdjcie tego kodu!
Spjrz na ten
kod! Jest taki
prosty i atwy
w utrzymaniu!
<body>
<div style="margin-top:25px; text-align:center">
<img id="seat0" src="" alt="" />
<img id="seat1" src="" alt="" />
<img id="seat2" src="" alt="" />
<img id="seat3" src="" alt="" />
<img id="seat4" src="" alt="" />
<img id="seat5" src="" alt="" />
<img id="seat6" src="" alt="" />
<img id="seat7" src="" alt="" />
<img id="seat8" src="" alt="" /><br />
<img id="seat9" src="" alt="" />
<img id="seat10" src="" alt="" />
<img id="seat11" src="" alt="" />
<img id="seat12" src="" alt="" />
<img id="seat13" src="" alt="" />
<img id="seat14" src="" alt="" />
<img id="seat15" src="" alt="" />
<img id="seat16" src="" alt="" />
<img id="seat17" src="" alt="" /><br />
<img id="seat18" src="" alt="" />
<img id="seat19" src="" alt="" />
<img id="seat20" src="" alt="" />
<img id="seat21" src="" alt="" />
<img id="seat22" src="" alt="" />
<img id="seat23" src="" alt="" />
<img id="seat24" src="" alt="" />
<img id="seat25" src="" alt="" />
<img id="seat26" src="" alt="" /><br />
<img id="seat27" src="" alt="" />
<img id="seat28" src="" alt="" />
<img id="seat29" src="" alt="" />
<img id="seat30" src="" alt="" />
<img id="seat31" src="" alt="" />
<img id="seat32" src="" alt="" />
<img id="seat33" src="" alt="" />
<img id="seat34" src="" alt="" />
<img id="seat35" src="" alt="" /><br />
<input type="button" id="findseats" value="Szukaj miejsc"
/>
</div>
</body>
Funkcjonalny JavaScript
Budownictwo
Obecnie midzy
mn i Mandango
zapanowa pokj.
Te tak to
czuj.
Schronienie
304
Rozdzia 6.
Funkcje
Zaginarka stron
Zegnij stron wzdu pionowych
linii, tak by oba mzgi si
poczyy, a nastpnie rozwi
zagadk.
Poywienie
Ciepo
tu. W takiej temperaturze
nie czuj si najlepiej.
Tak mi
zimno.
Schronienie
Prawa
obywatelskie