Professional Documents
Culture Documents
Edycja polska
Autor: Rebecca Riordan
Tumaczenie: Marcin Rog
ISBN: 978-83-246-1778-4
Tytu oryginau: Head First Ajax
Format: 200230, stron: 516
Technologia AJAX (skrt od ang. Asynchronous JavaScript and XML) tchna nowe
ycie w strony internetowe. Sprawia, e stay si one interaktywne, przyjazne w uyciu
oraz dynamiczne. Dziki niej aplikacje internetowe coraz bardziej przypominaj te
standardowe, znane z codziennej pracy. Jeli jednak ogrom moliwoci tej technologii
wydaje Ci si trudny do opanowania jeste w bdzie! Przekonaj si, e z dobrym
podrcznikiem nic nie bywa trudne! Head First Ajax. Edycja polska to kolejny przyjazny
podrcznik z cieszcej si wielkim uznaniem Czytelnikw serii Head First. Znajdziesz
tu nowatorskie i skuteczne techniki nauki, a przy tym duo praktycznych informacji
i humoru. Trudno wyobrazi sobie lepsze warunki do zdobywania nowej wiedzy. Dziki
tej ksice dowiesz si, jak myle po ajaksowemu, obsugiwa zdarzenia, okiezna
asynchroniczno oraz wykorzysta model DOM i format JSON. Te oraz wiele innych
ciekawych wiadomoci, dziki ktrym szybko opanujesz tajniki AJAX-a, znajdziesz
wanie w tym wyjtkowym podrczniku.
Przeznaczenie technologii AJAX
Skutki asynchronicznoci da w AJAX-ie
Obsuga zdarze w jzyku JavaScript
Wykorzystanie wielu procedur dla jednego zdarzenia
Operacje na drzewie DOM
Zastosowanie frameworkw oraz innych bibliotek
Uycie formatu XML w daniach i odpowiedziach
Format JSON
Tworzenie formularzy i ich walidacja
dania POST
Odkryj, jak skuteczny i przyjazny moe by podrcznik do nauki AJAX-a!
Spis treci
21
1.
33
2.
73
3.
123
4.
169
5.
201
6.
255
7.
307
8.
351
9.
365
10.
399
11.
427
12.
465
491
503
Wprowadzenie
Skierujmy mzg na Ajaksa. Ty starasz si czego nauczy, natomiast mzg stara ci si
wywiadczy przysug, pilnujc, aby to, czego si uczysz, nie zostao zapamitane. Mzg myli
sobie: Lepiej zostawi miejsce na bardziej istotne sprawy, na przykad ktrych zwierzt unika, czy
te dlaczego uprawianie snowboardingu nago jest zym pomysem. A wic jak mona zmyli mzg,
aby myla, e twoje ycie zaley od znajomoci Ajaksa?
Dla kogo jest ta ksika?
22
Wiemy, co mylisz
23
23
25
Oto co zrobilimy
26
27
Przeczytaj
28
30
Podzikowania
31
Spis treci
Ajax zastosowanie
Jestem zdesperowany,
ale nie sta mnie na szybsze
serwery ani na zesp
specjalistw.
34
35
37
38
44
46
48
52
54
56
57
58
59
60
62
63
67
68
70
thumbnails.js
getDetails.php
danie
Serwer odpowiada,
a przegldarka uruchamia
funkcj zwrotn.
serwer WWW
Serwer zawsze co
przetwarza i zwraca
dane... czasem kod
HTML, a czasem
surowe informacje.
Spis treci
Mylenie po ajaksowemu
Witamy wrd aplikacji ajaksowych to zupenie nowy wiat internetowy.
Utworzye ju swoj pierwsz aplikacj w metodologii Ajax i zaczynasz zastanawia si, jak
wprowadzi dania asynchroniczne do pozostaych swoich witryn. Ale w Ajaksie nie wszystko
sprowadza si do programowania. Musisz inaczej myle o aplikacji. Samo wykonywanie
da asynchronicznych nie sprawia, e staje si ona bardziej przyjazna dla uytkownika.
To ty powiniene mu pomc unikn popenienia bdw, a to oznacza konieczno
powtrnego przemylenia projektu caej aplikacji.
Tradycyjna witryna Mikea jest do bani
W trakcie...
Nazwa uytkownika
jest w porzdku.
Nazwa uytkownika
jest zajta.
76
81
84
86
Co kiedy si wydarza?
87
A na serwerze...
88
90
91
94
96
Co ju zrobilimy...
99
Przycisk wysyania
jest wyczony.
Ten obrazek
informuje,
e nazwa
uytkownika
jest
w porzdku.
74
99
102
103
106
108
109
112
113
114
115
Teraz moesz
przesa stron.
Spis treci
Zdarzenia w JavaScripcie
3
Pocztkujcy.
Tu powiniene zacz,
jeeli nie uprawiae
jeszcze jogi.
rednio zaawansowany.
Jeeli kurs dla pocztkujcych
przesta by wyzwaniem,
sprbuj swoich si tutaj.
Zaawansowany.
Bardzo wymagajcy!
10
Reagowanie na uytkownikw
Czasami kod musi reagowa na inne rzeczy dziejce si w aplikacji
internetowej... W takiej sytuacji przydatne s zdarzenia. Zdarzenie jest czym, co dzieje si
na stronie, w przegldarce, a nawet na serwerze. Nie wystarczy jedynie wiedzie o zdarzeniach...
Czasami trzeba na nie odpowiedzie. Tworzc kod i rejestrujc go jako procedur obsugi
zdarzenia, moesz sprawi, aby przegldarka wykonywaa go zawsze, gdy wystpi okrelone
zdarzenie. Pocz zdarzenia i ich procedury obsugi, a otrzymasz interaktywne aplikacje
internetowe.
Wszystko zaczo si od psa z gow w d
124
131
132
134
137
138
143
144
147
148
149
150
151
152
157
158
163
164
165
Spis treci
Dwoje to ju towarzystwo
Jedna procedura obsugi zdarzenia nie zawsze wystarcza. Czasami zdarzenie musi
wywoa kilka procedur obsugi. By moe musisz utworzy jakie operacje specyficzne dla zdarzenia
oraz kod generyczny; wwczas umieszczenie tego wszystkiego w jednej procedurze obsugi nie uda
si. Albo po prostu chcesz utworzy jasny kod wielokrotnego uytku i masz dwa fragmenty
funkcjonalnoci wyzwalane przez to samo zdarzenie. Na szczcie moemy uy metod z DOM
Poziom 2, aby przypisa kilka procedur obsugi do jednego zdarzenia.
Do zdarzenia moe by przypisana tylko jedna procedura obsugi
(a przynajmniej tak si wydaje)
170
171
171
172
174
178
179
179
184
185
187
187
189
190
Musimy nazwa argument Event, aby nasze funkcje mogy z nim pracowa
191
192
196
id="advanced"
<a
id=""advanced"
id="advanced"
href="#"
...
onmouseover = showHint
/>
XHTML file
currentBtn.
onmouseover =
showHint;
title="advanced"
href="#"
<a> element
title,
Obiekt <a> ma waciwoci: id,
o
href i onmouseover. Kada waciw
posiada swoj nazw i warto.
JavaScript file
11
Spis treci
Aplikacje asynchroniczne
202
204
205
206
209
210
215
224
225
226
232
237
238
240
244
246
249
12
Poprosz go o
podwyk. Wicej
gryzakw.
A to oznacza, e czekajc
na col, moesz robi, co chcesz.
Nie jeste unieruchomiony jak
wtedy, gdy Rufus by synchroniczny.
Spis treci
256
257
258
260
261
263
270
Rozpoczynamy od XHTML-u...
272
281
282
286
288
298
300
Wygraem? Wygraem?
304
305
#tabs {
...
}
<html>
<script src=
...js />
<img src=
siteLogo
.png />
</html>
document
Obiekt document
zawiera struktur strony
zdefiniowan przez kod
XHTML.
classes.html
yoga.css
schedule.js
13
Spis treci
Manipulowanie DOM-em
wywietlenia
Gra rozpoczyna si od siatce
liter umieszczonych na kadym razem
Za
o wymiarach 5 na 5.
przypadkowy.
ukad liter powinien by
Gracze mog
przesya
sowo, aby
sprawdzi jego
poprawno...
308
312
313
315
317
319
320
14
Uyte sowa
s umieszczane
w tym okienku.
321
324
324
325
326
334
334
336
336
341
Spis treci
Zalety frameworkw
Wady frameworkw
357
358
359
362
364
366
369
375
381
388
15
Spis treci
JSON
10
Syn JavaScriptu
JavaScript, obiekty i notacja, o rany! Jeeli bdziesz musia kiedy reprezentowa obiekty
w JavaScripcie, pokochasz JSON, JavaScript Standard Object Notation. Dziki JSON-owi
moesz reprezentowa zoone obiekty i odwzorowania za pomoc tekstu i kilku nawiasw
klamrowych. Co wicej, moesz wysya i odbiera JSON w innych jzykach, takich jak PHP, C#
i Ruby. Ale jak JSON sprawuje si jako format danych? Obr kartk i si przekonaj...
XML
responseDoc = request.responseXML;
Serwer WWW
JSON
description = item.description;
16
Serwer WWW
401
402
403
405
405
406
412
413
419
422
Spis treci
Formularze i walidacja
11
428
434
440
441
443
446
450
450
453
457
457
463
464
danie
enroll.js
serwer WWW
Strona WWW
JavaScript
Serwer
17
Spis treci
dania POST
12
register.php?
Serwer WWW
Serwer otwiera
danie POST
i dekoduje dane
z dania...
...ktrymi w przypadku
witryny Mikea s
informacje o kliencie
username=jkowalski
password=iheartalba
firstname=Jan
lastname=Kowalski
email=jk@mac.com
genre=action
favorite=Casino Royale
tastes=Akcja, akcja, akcja!
W kocu serwer
przesya dane do
programu okrelonego
przez URL.
<?php...
?>
register.php
18
466
469
470
472
474
476
478
479
480
482
Spis treci
Pozostaoci
492
2. agodna degradacja
495
496
498
5. Ajax i ASP.NET
500
Funkcje narzdziowe
Skorowidz
504
507
19
Mylenie po ajaksowemu
Wykonywanie z Ajaksem dwch
czynnoci jednoczenie... Rety,
to jest super! Ale przyznam,
e musz zupenie zmieni
sposb mylenia.
73
szani
Uytkownicy nie powinni by zmu
tylko
pl
iu
om
nia
enie
wyp
do
dane
po to, aby dowiedzie si, czy
w pierwszym polu s poprawne.
Teraz uytkownik
formularz i klika wypenia
Zarejestruj... przycisk
Na
czeka, majc na stpnie
dz
e wszystko si iej,
uda.
zarejestrowa i przej
dalej, poza stron
rejestracji.
74
Rozdzia 2.
wiczenie
1
Mike jest w prawdziwych tarapatach. Ty jednak, nawet po napisaniu jednej aplikacji ajaksowej,
powiniene mie kilka pomysw na usprawnienie jego witryny. Spjrz na schemat obecnego
sposobu dziaania aplikacji i napisz, co twoim zdaniem powinno si dzia. Nastpnie odpowiedz
na pytania znajdujce si na dole strony.
serwer WWW
3
4
Serwer wywietla
ekran powitalny...
lub
Wszystkie informacje
wnika
wpisane przez uytko
..
ne.
aco
utr
zostaj
te.
Wszystkie pola s pus
jeste tutaj
75
dania asynchroniczne
danie
Funkcja zwrotna
wywietli komunikat
o bdzie tylko wtedy,
gdy wystpi problem.
W midzyczasie
uytkownik wci
moe pracowa.
76
Rozdzia 2.
danie
zwrotne
wywoanie
funkcji {
...
}
JavaScript
Serwer przekazuje
do naszej funkcji
zwrotnej, czy nazwa
uytkownika jest
wolna, czy zajta.
a
Wana zasada projektow
e
ksi
w Aja
Nie istniej
gupie pytania
jeste tutaj
77
wiczenie
Czas popracowa nad witryn Mikea. Poniej spisano 5 krokw, ktre naley wykona, aby witryna dziaaa,
ale brakuje szczegowych informacji na ich temat. Ponadto pomieszano kolejno czynnoci. Uporzdkuj je
i napisz jedno lub dwa zdania o tym, co powinno si wydarzy na kadym z etapw.
dla pl formularza.
Ustaw procedury obsugi zdarze
............................................
............................................................... ............................................
.......
........................................................
............................................
............................................................... ............................................
.......
........................................................
?
78
Rozdzia 2.
window.onload
= initPage;
urlHeader=...
rzy i _____
Funkcja JavaScript two
_.
__
__
obiekt
danie
username
validation.js
window.onload
= initPage;
urlHeader=...
danie
0
validation.js
c,
____ zwraca warto wskazuj
czy _____ zostaa _____.
Moemy wywietli
may symbol, aby da
uytkownikowi jak
wskazwk wizualn.
jeste tutaj
79
wiczenie:
Rozwizanie
1
Twoje zadanie polegao na uporzdkowaniu etapw tworzenia ajaksowej wersji witryny z recenzjami
i na dodaniu brakujcych opisw poszczeglnych czynnoci. Miae rwnie uzupeni brakujce sowa
w schematach.
W poprzednim rozdziale
przelizgnlimy si przez t
funkcj, ale teraz omwimy
j szczegowo.
Zdarzenie onblur
wywouje nasz
kod JavaScript.
window.onload
= initPage;
urlHeader=...
danie
username
validation.js
zeniu
informacje o sukcesie lub niepowod z uytkownika.
prze
bez utraty informacji wpisanych
window.onload
= initPage;
urlHeader=...
danie
0
validation.js
80
Rozdzia 2.
Uwaga!
Uywaj otwierajcego
i zamykajcego znacznika
<script>.
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Filmy Mike'a</title>
<link rel="stylesheet" href="css/movies.css" />
<script src="scripts/validation.js" type="text/javascript"></script>
</head>
Uruchom to!
<html>
<script src=
... js />
<img
src=siteLogo.
png />
</html>
registration.html
Wprowad zmiany
do pliku registration.html
strony rejestracji
witryny Mikea.
Nie istniej
gupie pytania
P: I w czym problem?
jeste tutaj
81
WYT
UMYS
82
Rozdzia 2.
jeste tutaj
83
PROGRAMOWA konfiguracja
procedury obsugi zdarzenia window.onload
Chcemy, aby cz kodu JavaScript bya uruchamiana przy adowaniu strony
rejestracji, a to oznacza, e naley go doczy jako procedur obsugi jednego
z pierwszych zdarze window.onload.
Moemy to zrobi programowo, ustawiajc waciwo onload obiektu window.
Jak? Przyjrzyjmy si, co dokadnie si dzieje podczas otwierania strony
rejestracji przez uytkownika witryny Mikea:
http://headfirstlabs.com/.../registration.html
Przegldarka da strony
rejestracji (XHTML)...
...a serwer
zwraca stron.
<html>
<script src=
"...js" />
<img src=
"siteLogo
.png" />
</html>
registration.html
validation.js
<html>
<script src=
"...js" />
<img src=
"bgContent.
jpg" />
</html>
bgContent.jpg
bgContent.jpg
registration.html
validation.js
84
Rozdzia 2.
zystkie
...a serwer zwraca ws ej
dane pliki (w dowoln
kolejnoci).
window.
onload.=
initPage;
urlHeader=
...
window
validation.js
onload = initPage
Ustawiana jest
waciwo onload
obiektu window.
initPage()
Definiowane s rwnie
funkcje. Znajdujce si
w nich instrukcje nie s
wykonywane do momentu
wywoania funkcji.
Te przypisania znajduj si
poza funkcjami, dziki czemu
s uruchamiane przy pierwszym
parsowaniu kodu JavaScript.
window.
onload.=
initPage;
urlHeader=
...
window
onload = initPage
Wywietlana jest
ju caa zawarto
strony...
validation.js
...wic przegldarka
wywouje onload.
jeste tutaj
85
window.onload.=
initPage;
urlHeader= ...
Chcemy, aby nasza procedura obsugi zdarzenia bya uruchamiana wraz z wywietleniem
strony. Dlatego musimy przypisa funkcj do waciwoci onload obiektu window.
validation.js
funkcj... Jest on
Ten kod nie jest zas odczytu skryptu
dc
po
wykonywany
.
przez przegldark
window.onload = initPage;
function initPage() {
To nakazuje
przegldarce
wywoa funkcj
checkUsername(),
gdy uytkownik
opuci pole nazwy
uytkownika
w formularzu.
document.getElementById(username).onblur =
checkUsername;
}
Oto kolejny przypadek
programowego przypisania
procedury obsugi zdarzenia.
W rozdziaach 5. i 6. dokadnie
omwimy metod getElementById.,
Na razie musisz jedynie wiedzie
e zwraca ona element XHTML
o okrelonym identyfikatorze.
function checkUsername() {
// uzyskaj obiekt dania
// i wylij go do serwera
To jest funkcja,
ktra bdzie
tworzya
i wysyaa
obiekt dania.
Napiszemy
j troszeczk
pniej.
function showUsernameStatus() {
To zaktualizuje
stron po otrzymaniu
odpowiedzi z serwera.
Uruchom to!
86
Rozdzia 2.
Co kiedy si wydarza?
Na tym etapie wiele si dzieje. Omwmy to dokadnie, aby mie
pewno, e wszystko odbywa si dokadnie wtedy, gdy tego chcemy.
Na pocztku...
Gdy przegldarka aduje plik XHTML, znacznik
<script> nakazuje jej zaadowa plik JavaScript.
Cay kod, ktry znajduje si na zewntrz funkcji,
w tym pliku zostanie wykonany natychmiast,
a interpreter JavaScriptu w przegldarce utworzy
funkcje, cho kod znajdujcy si w nich nie zostanie
jeszcze wykonany.
<head>
...
window.onload.=
<script src=...>
initPage;
<script src=...>
urlHeader= ...
</head>
validation.js
registration.html
Nastpnie...
Instrukcja window.onload nie znajduje si w funkcji,
wic zostanie uruchomiona tu po zaadowaniu pliku
skryptowego validation.js przez przegldark.
window.onload
window.onload.=
initPage;
urlHeader= ...
initPage()
validation.js
I w kocu...
Funkcja initPage() zostaje uruchomiona.
Wyszukuje ona pole o identyfikatorze username.
Nastpnie przypisuje funkcj checkUsername()
do zdarzenia onblur tego pola.
Efekt jest taki sam jak po wpisaniu
onblur=checkUsername() w kodzie XHTML.
Jednak nasz sposb jest bardziej czytelny, poniewa
oddziela kod (funkcj JavaScript) od struktury
i zawartoci (XHTML).
function
Zarwno przypisanie
window.onload, jak i funkcja
initPage() znajduj si
w pliku validation.js.
initPage() {
...
}
username.onblur
validation.js
registration.html
jeste tutaj
87
A na serwerze...
Zanim bdziemy mogli przetestowa efekty naszej pracy nad stron rejestracji,
musimy sprawdzi serwer. Co serwer powinien dosta od nas w daniu?
Czego moemy oczekiwa od serwera?
do
Zamierzamy przesa wnika
tko
uy
w
naz
ra
we
ser
zajcego
wybran przez odwied
witryn.
username
danie
okay lub denied
Jeeli nazwa uytkownika
jest dostpna, serwer zwrci
okay. W przeciwnym
przypadku zwrci denied.
Spokojnie
Pamitaj, e wybrane
y
program pracujce po stronie
serwera s dostpne wrd
przykadw do tej ksiki pod adresem
ftp://ftp.helion.pl/przyklady/hfajax.zip.
Nie istniej
gupie pytania
window?
88
Rozdzia 2.
Jazda prbna
Zabierz now stron rejestracji na przejadk.
Upewnij si, e wprowadzie wszystkie zmiany do plikw registration.html i validation.js,
a nastpnie zaaduj stron rejestracji w przegldarce. Niewiele si zmienio, prawda?
Funkcja initPage() nie przynosi adnych widocznych rezultatw, a funkcja
checkUsername() jeszcze w ogle nic nie robi... Musimy jednak sprawdzi, czy funkcja
checkUsername() jest wywoywana, gdy uytkownik wpisze nazw uytkownika
i przejdzie do wypeniania innego pola.
To troch toporne, ale dodajmy kilka instrukcji alert(), aby upewni si, e funkcje,
ktre napisalimy, s faktycznie wywoywane.
window.onload = initPage;
function initPage() {
document.getElementById("username").onblur = checkUsername;
alert("Wewntrz funkcji initPage().");
}
function checkUsername() {
// uzyskaj obiekt dania i wylij go do serwera
alert("Wewntrz funkcji checkUsername().");
}
function showUsernameStatus() {
// aktualizuj stron, aby wskaza, czy nazwa uytkownika zostaa przyjta
}
window.onload.=
initPage;
urlHeader= ...
validation.js
je nam
Funkcja alert() dacj zwrotn.
wizualn informa initPage()
Wiemy, e funkcja..
jest wywoywana.
jeste tutaj
89
w
Wikszo tych szczeg
h
zmienia si w rnyc ich
aplikacjach zalenie od ,
funkcjonalnoci, ukadu
stylu itd.
window.onload.=
initPage;
Tworzony jest
nowy obiekt
dania.
urlHeader= ...
createRequest() {...}
validation.js
danie
danie
"okay"
okay
Serwer zwraca
lub denied.
"denied"
4
serwer WWW
90
Rozdzia 2.
username
Ta cz czyli tworzenie
obiektu dania jest
taka sama we wszystkich
aplikacjach w metodologii
Ajax.
Uwaga!
IE5 na komputerach
Macintosh wci nie
dziaa, nawet z tym
kodem niezalenym od
rodzaju przegldarki.
function createRequest() {
try {
request = new XMLHttpRequest();
To jest obsugiwane
} catch (tryMS) {
przez wiele przegldarek,
a tym samym przez wielu
try {
uytkownikw.
request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (otherMS) {
try {
Pamitaj, e musimy
nie
ki
request = new ActiveXObject("Microsoft.XMLHTTP");
prbowa, dop
znajdziemy skadni
}
catch
(failed) {
zrozumiaej dla kadej
przegldarki.
request = null;
}
}
Ten wiersz zwraca danie do kodu
wywoujcego.
}
return request;
}
Nie istniej
gupie pytania
jeste tutaj
91
request = createRequest();
createRequest() {...}
validation.js
"okaayy"
Wikszo te
go jest specyf
dla aplikacji.
iczna
.. Trudno
wykorzysta
to ponownie.
danie
username
92
Rozdzia 2.
utils.js
h
Wprowad kad z tyc
go
sne
wa
do
ian
zm
kodu, odhaczajc
kolejne punkty.
function createRequest() {
try {
request = new XMLHttpRequest();
} catch (tryMS) {
try {
request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (otherMS) {
try {
request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed) {
request = null;
}
}
}
function
createReq
{
...
}
utils.js
Zazwyczaj warto
umieci kod
narzdziowy jako
pierwszy, a kod
specyficzny dla
aplikacji jako drugi.
Jeli wyrobisz sobie
takie nawyki, kod,
ktry napiszesz,
bdzie postrzegany
jako spjny
i uporzdkowany.
return request;
}
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Filmy Mike'a</title>
<link href="movies.css" rel="stylesheet" type="text/css" />
<script src="scripts/utils.js" type="text/javascript"></script>
<script src="scripts/validation.js" type="text/javascript"></script>
</head>
<html>
<script
src="...js" />
<img src=
"siteLogo.png"
/>
</html>
gupie pytania
P: Dlaczego umiecilimy odwoanie do utils.js P: Ale wci nie rozumiem, jak dziaa
przed odwoaniem do validation.js?
funkcja createRequest()...
registration.html
Oddziel to,
co jest identyczne
w rnych
aplikacjach,
i przekszta
ten kod
w zestaw funkcji
wielorazowego
uytku.
jeste tutaj
93
function
createReq
{
...
}
utils.js
Tworzenie funkcji.
Rozpoczynamy od utworzenia funkcji, ktr moe wywoa kady inny kod, gdy bdzie
potrzebowa obiektu dania.
function createRequest() {
Ta funkcja moe
by wywoana
ca
z dowolnego miejs
ji.
ac
lik
w ap
skadni
Niezalenie od uytej u
nowy egzemplarz obiektywa
dania bdzie zachow
si tak samo.
XMLHttpRequest
dziaa w Safari,
Firefoksie,
Mozilli, Operze
i wikszoci
przegldarek poza
tworzonymi przez
Microsoft.
try {
request = new XMLHttpRequest();
} catch (tryMS) {
// nie zadziaao, wic sprbujemy czego innego
}
}
try {
request = new ActiveXObject(Msxml2.XMLHTTP);
} catch (otherMS) {
Cay ten
kod...
try {
wstawiamy
tutaj.
94
Rozdzia 2.
To oddziela kod
wywoujcy
od fragmentw
zwizanych
z kompatybilnoci
przegldarek.
To umiecimy
w ostatnim
bloku catch.
request = null;
innych
Dla przegldarek .
ni microsoftowe
try {
request = new XMLHttpRequest();
} catch (tryMS) {
try {
Dla fanw
Internet
Explorera.
} catch (otherMS) {
try {
request = new ActiveXObject(Microsoft.XMLHTTP);
} catch (failed) {
Mimo wszystko
zawsze co
zostanie
zwrcone,
choby tylko
warto null.
request = null;
}
}
}
return request;
}
CELNE SPOSTRZEENIA
Q
W rnych przegldarkach
do uzyskania obiektu dania
uywana jest odmienna skadnia.
Kod powinien uwzgldnia kady
rodzaj skadni, aby aplikacja dziaaa
w rnych przegldarkach.
jeste tutaj
95
Pamitaj, e funkcja
createRequest() nie
obsuguje bdw,
wic musimy to zrobi
samodzielnie.
To wsppracuje
z formularzem.
Tutaj przygotowujemy
si do wysania nazwy
uytkownika do serwera.
96
Rozdzia 2.
Magnesiki z kodem
Wikszo kodu funkcji checkUsername() porozklejano na lodwce.
Czy potrafisz poskada go z powrotem? Nawiasy klamrowe spady
na podog i s zbyt mae, aby je znale i podnie. Moesz ich wic
dopisa tyle, ile bdziesz potrzebowa.
function checkUsername() {
}
alert("Nie mona utworzy dania");
l);
send(nul
request.
validation.js
if (request == null
)
e {
} els
request.onreadystatechange = showUsernameStatus;
request =
createReq
uest();
me);
= escape(theNa
var username
jeste tutaj
97
function checkUsername() {
request = createRequest();
if (request == null)
utils.js
} else {
Metoda getElementById
wyszukuje pole formularza
o identyfikatorze username.
value to warto
wpisana przez
uytkownika
}
}
Nazw uytkownika
doczamy do
adresu URL.
si
Cay ten kod znajduje
w pliku validation.js.
window.
onload. =
initPage;
urlHeader
=...
validation.js
98
Rozdzia 2.
Co ju zrobilimy...
Przygotowalimy si do tego, aby danie zostao przesane do serwera,
kiedy tylko internauta wpisze now nazw uytkownika.
t()
Za pomoc funkcji createReques
z pliku utils.js JavaScript
uzyskuje i wysya obiekt dania.
function
createReq
{
...
}
danie
username
utils.js
validation.js
danie
"okay"
validation.js
n, wywietlajc
Funkcja zwrotna aktualizuje stro owodzeniu, bez utraty
komunikat o powodzeniu lub niep
uytkownika.
informacji wprowadzonych przez
Nie istniej
gupie pytania
jeste tutaj
99
Jazda prbna
Jazda prbna
Zanim przejdziemy dalej, upewnijmy si, e wszystko dziaa...
Nasz kod JavaScript wci nie aktualizuje strony w aden sposb. Korzystajc z kilku dodatkowych
funkcji alert(), moemy jednak sprawdzi, czy funkcja checkUsername() dziaa zgodnie z naszymi
oczekiwaniami.
W edytorze tekstu otwrz plik validate.js i dopisz do funkcji checkUsername() kod przedstawiony
poniej. Jest to ten sam kod, nad ktrym pracowae w wiczeniu z magnesikami, ale znajduje si
w nim kilka alertw pozwalajcych ledzi, co robi przegldarka.
Po dodaniu kodu zapisz plik i zaaduj stron w przegldarce. Wpisz cokolwiek do pola
przeznaczonego na nazw uytkownika. Powinny zosta wywietlone wszystkie komunikaty.
function checkUsername() {
request = createRequest();
if (request == null)
alert(Nie mona utworzy dania)
else
{
alert(Mam obiekt dania);
var theName = document.getElementById(username).value;
alert(Pierwotna warto nazwy: + theName);
var username = escape(theName);
alert(Warto nazwy po czyszczeniu: + username);
var url= checkName.php?username= + username;
alert(URL: + url);
request.onreadystatechange = showUsernameStatus;
request.open(GET, url, true);
request.send(null);
}
}
100
Rozdzia 2.
validation.js
Te alerty s czym
w rodzaju komunikatw
o stanie albo informacjami
z debuggera... Pozwalaj
nam si dowiedzie, co si
dzieje za kulisami.
Poczekaj chwil... To ma by
prawdziwy projekt aplikacji?
Kilka instrukcji alert()
i wyskakujcych okienek?
rozwizania
Po przeledzeniu w usuniesz
lem
ob
pr
h
kic
wszyst
kcje alert().
wszystkie instru
jeste tutaj
101
serwer
Podczas przetwarzania dania
oc
pom
Za
.
razy
kilka
nie
na
wie
odpo
arka
gld
prze
te
ySta
read
ci
waciwo
informuje, na ktrym etapie
nie.
przetwarzania znajduje si da
readyState
responseXML
responseText
danie
Odpowiedziami
w formacie XML
zajmiemy si dokadniej
w rozdziale 9.
status
onreadystatechange
statusText
Waciwoci status i
sta
pozwalaj przegldarce tusText
stan dania http zw przekaza do kodu
rc
np. 200 dla OK, gdy ony przez serwer
wszystko przebiego pop serwer uwaa, e
lub Not Found, gdy ser rawnie, albo 404
wer nie odnalaz
danego URL.
Za pomoc waciwoci
onreadystatechange informujemy
przegldark, ktr funkcj ma
wywoa, gdy serwer odpowie
na danie.
102
Rozdzia 2.
Funkcja createRequest(
uzyskuje od przeglda )
egzemplarz obiektu drki
ania.
createRequest()
utils.js
danie
przegldarka
danie
checkUsername()
validation.js
Przegldarka komunikuje
si z serwerem
za porednictwem
protokou HTTP.
danie
showUsernameStatus()
serwer WWW
validation.js
Stany gotowoci
i
To jest stan gotowoc
we
ny
isa
zap
a
ani
d
e.
waciwoci readyStat
readyState
opuszcza
Gdy uytkownik wnika,
ko
yt
u
y
zw
na
pole
uest()
funkcja createReq nia.
da
t
iek
ob
tworzy
request = createRequest();
Poczenie
niezainicjalizowane
showUsernameStatus()
104
Rozdzia 2.
validation.js
Waciwo readyState
rwna 1 oznacza,
e danie jest gotowe
do wysania.
readyState
Poczenie
zainicjalizowane
request.send(null);
readyState
danie
jest
przetwarzane
readyState
Serwer przesya
odpowiedzi na rnych
etapach procesu
przetwarzania dania.
Pobieranie
odpowiedzi
serwera
readyState
Serwer zakoczy
przetwarzanie dania,
a dane s gotowe
do wykorzystania.
Odpowied
serwera
gotowa
function checkUsername() {
request = createRequest();
...
request.onreadystatechange = showUsernameStatus;
...
}
function showUsernameStatus() {
if (request.readyState == 4) {
if (request.status == 200) {
if (request.responseText == okay) {
W responseText
jest przechowywana
warto tekstowa
zwracana przez
serwer. Jeeli
jest ni okay,
oznacza to, e
nazwa uytkownika
jest wolna.
validation.js
ktrej uylimy
To jest nazwa funkcji, ystatechange.
ead
onr
we waciwoci
zgodne,
Jeeli nazwy nie bd woana.
wy
ie
tan
zos
nie
a
kcj
fun
Instrukcja if daje pewno, e dalsza
cz kodu nie zostanie wykonana, jeeli
readyState ma warto rn od 4, ktra
oznacza, i serwer zakoczy prac nad
daniem.
Jeli nie wystpiy ad
serwer wysya status ne bdy,
200.
106
Rozdzia 2.
validation.js
Jazda prbna
Dopisz funkcj showUsernameStatus() do pliku validation.js
i zaaduj stron w przegldarce.
Sprbuj wpisa jakkolwiek nazw uytkownika, oprcz stefan i natalia.
Przegldarka powinna wywietli wszystkie alerty, ktre napisalimy w celu
przetestowania funkcji initPage() i checkUsername().
Jeeli wpiszesz poprawn
nazw uytkownika, zostan
wywietlone alerty z kodu
debugujcego, ale aden
nie bdzie wskazywa
na wystpienie bdu.
Czy to dziaa?
108
Rozdzia 2.
danie
jmuje si tym,
Serwer nie prze roniczne nie
ch
yn
as
nie
da
e
ika do zmiany
wn
ko
yt
u
io
zmus
zwraca pust
tu
os
pr
Po
nazwy.
em o bdzie.
at
nik
mu
ko
stron z
To postaramy si naprawi!
Znikno nawet okienko
z komunikatem o niedostpnoci
nazwy uytkownika!
Oczekuj nieoczekiwanego
Franek
Przygotuj plan na
KAD sytuacj!
110
Rozdzia 2.
Wprowad
te zmiany do
swojego kodu
i zaznacz
pola.
Prawdopodobnie metoda
getElementById zaczyna
ju wyglda znajomo.
Daje ona dostp
do elementu
na stronie XHTML.
function checkUsername() {
document.getElementById("status").src = "images/inProcess.png";
request = createRequest();
zka
validation.js
Moemy
zastpi
wyskakujce
okienko
przyjemniejsz
ikonk.
function showUsernameStatus() {
Ta grafika jest wywietlana,
gdy serwer zaakceptuje
nazw uytkownika.
if (request.responseText == "okay") {
document.getElementById("status").src = "images/okay.png";
}
else {
alert("Przykro nam, ale nazwa uytkownika jest zajta.");
document.getElementById("status").src = "images/inUse.png";
}
Ta grafika zostaje
wywietlona, jeeli nazwa
WYSIL
validation.js
SZARE KOMRKI
Co sdzisz o tym rozwizaniu? Czy jest ono zgodne z zasad rozdzielania prezentacji i treci?
Zmieniby tutaj co?
jeste tutaj
111
istniejcy CSS
#username { padding: 0 20px 0 2px; width: 198px; }
Dopisz
te cztery
wiersze do
kodu CSS.
112
Rozdzia 2.
#detail {
...
}
movies.css
W trakcie...
Nazwa uytkownika
jest w porzdku.
Nazwa uytkown
ika
jest zajta.
#username.thinking
#username.approved
#username.denied
ech
To s nazwy trz
klas CSS.
Za pomoc
waciwoci
className
elementu
moesz zmieni
klas CSS.
if (request.responseText == "okay") {
document.getElementById("status").src = "images/okay.png";
document.getElementById("username").className = "approved";
}
else {
alert("Przykro nam, ale nazwa uytkownika jest zajta.");
document.getElementById("status").src = "images/inUse.png");
document.getElementById("username).className = "denied");
}
jeste tutaj
113
Rzdzisz
istniejcy CSS
#username {
background: #fff url('../images/status.gif') 202px 0 no-repeat;
Projektantka
witryny Mikea
ma zawsze
peno nowych
pomysw.
validation.js
114
Rozdzia 2.
Odpowiednie oddzielenie
treci, prezentacji
i zachowania znacznie
zwiksza elastyczno
aplikacji.
if (request.responseText == "okay") {
validation.js
document.getElementById("username").className = "approved";
document.getElementById("register").disabled = false;
}
else {
document.getElementById("username").className = "denied";
To kieruje
uytkownika
z powrotem
do pola nazwy
uytkownika.
document.getElementById("username").focus();
document.getElementById("username").select();
document.getElementById("register").disabled = true;
}
ika jest
Jeeli nazwa uytkown estruj
rej
Za
sk
yci
zajta, prz
y.
powinien by wyczon
validation.js
jeste tutaj
115
Sprawd to
Jazda prbna
Upewnij si, e wprowadzie zmiany w plikach validation.js i movies.css.
Zaaduj stron i sprawd, czy wszystko dziaa zgodnie z oczekiwaniami.
Przycisk wysyania
jest wyczony.
Uwaga!
Ten obrazek
informuje,
e nazwa
uytkownika
jest
w porzdku.
116
Rozdzia 2.
Wanie to miaem na
myli: usatysfakcjonowani
uytkownicy i fajniejsza
strona rejestracji.
Ekstra! Jest
tak dobra, na
jak wyglda...
Super!
Tego nie obejrz
i oszczdz 50 zotych
na biletach.
.
Mike jest szczliwy..
...a fani mog si
do jego recenzji. dosta
jeste tutaj
117
Magnesiki z etykietami
Wszystkie etykiety opisujce, co si dzieje na nowej, poprawionej
stronie rejestracji, spady na podog. Czy potrafisz umieci je
w odpowiednich miejscach?
);
eateRequest(
request = cr
0
Niezainicjalizowane
showUsernameStatus()
2
Przygotowywanie
odpowiedzi
3
Pobieranie
odpowiedzi
request
.send(n
ull);
4
1
Gotowa
odpowied
uszcza
Gdy uytkownik op
gujca
su
pole, funkcja ob
iekt
ob
y
orz
tw
nie
zdarze
dania.
Zainicjalizowane
Serwer w
ysya odp
owiedzi
na kilku
etapach p
rocesu.
problemem serwer
Podczas pracy nad
tate rwnym 2.
odpowiada z readyS
owiedzi s
odp
ki
Stan i nagw
ne.
dostp
118
Gdy read
yState w
ynosi 4,
funkcja zw
rotna uy
wa
odpowied
zi s
zaktualizo erwera do
wania str
ony.
Znajd sowo
Powi chwil i pozwl troch popracowa prawej pkuli. Oto standardowe
wyszukiwanie sw. Wszystkie zostay wymienione w tym rozdziale.
Lista sw
ActiveXObject
Ajax
Callback
Readystate
Send
URL
XMLHttpRequest
CreateRequest
Initpage
Null
Open
jeste tutaj
119
za
Gdy uytkownik opuszc
ca
uj
ug
obs
a
kcj
fun
e,
pol
zdarzenie tworzy obiekt
dania.
);
eateRequest(
request = cr
0
Niezainicjalizowane
showUsernameStatus()
2
Przygotowywanie
odpowiedzi
Przed wykon
aniem tej
instrukcji ob
iekt dania
wie,
jak i gdzie si
poczy.
request
.send(n
ull);
Pobieranie
odpowiedzi
4
1
Gotowa
odpowied
Gdy read
yState w
ynosi 4,
funkcja zw
rotna uy
wa
odpowied
zi s
zaktualizo erwera do
wania str
ony.
Serwer w
ysya odp
owiedzi
na kilku
etapach p
rocesu.
120
Rozdzia 2.
Zainicjalizowane
jeste tutaj
121