Aplikacje internetowe Instrukcja do laboratorium 3

Transkrypt

Aplikacje internetowe Instrukcja do laboratorium 3
Aplikacje internetowe
Instrukcja do laboratorium 3
Javascript w XHTML
JavaScript jest prostym językiem w którym pisze się małe "programiki" pod strony
internetowe. Wielu ludzi nie potrafi odróżnić języka JavaScript od języka Java. Nie wolno mylić
tych języków ponieważ są one całkiem odmienne. Zasadniczą różnicą jest to, że Java jest językiem
programowym, wymaga skompilowania, a JavaScript jest językiem skryptowym wykonywanym po
stronie klienta (w przeglądarce).
Skrypt JS umieszcza się w znaczniku <script>, który ma obowiązkowy atrybut type, a jego
wartością ma być text/javascript.
1. Utwórz nowy plik .html:
<?xml version="1.0" encoding="iso-8859-2" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl"
dir="ltr">
<head>
<title>Moj pierwszy skrypt JS w XHTML</title>
<meta http-equiv="Content-Type" content="application/xhtml+xml;
charset=iso-8859-2"/>
<meta http-equiv="Content-Language" content="pl"/>
</head>
<body>
<script type="text/javascript">alert("Witaj!");</script>
<p>Treść strony</p>
</body>
</html>
Sprawdź działanie skryptu w przeglądarkach. Zauważ kiedy pojawia się treść strony.
Przenieś teraz skrypt poniżej treści strony, sprawdź działanie skryptu w przeglądarce.
Sprawdź czy strona jest zgodna ze standardem (http://validator.w3.org)
2. Zmień teraz skrypt JS na poniższy:
if (2 < 4) { alert("Witaj!"); }
Sprawdź działanie w przeglądarce, a następnie sprawdź zgodność ze standardem.
JavaScript zwykle zawiera znaki (<, &) , które nie mogą istnieć w dokumencie XHTML
poza sekcjami CDATA. Wobec tego jeśli w dokumencie xhtml musimy wstawić
wykonywanie skryptu, wstawiamy go w blok CDATA:
<script type="text/javascript">
<![CDATA[ if (2 < 4) { alert("Witaj!"); } ]]>
</script>
Uwaga, starsze przeglądarki mogą nie interpretować poprawnie CDATA, więc można sam
ten znacznik (i zamykający) wziąć w komentarze js /* <![CDATA[ */ i /* ]]> */
3.
O wiele wygodniej i często wydajniej jest umieszczać skrypty w osobnym pliku. Plik ma
zawierać wyłącznie JavaScript, dlatego nie trzeba używać w nim CDATA.
W elemencie <script> ścieżkę do pliku wskazuje atrybut src. Jeśli jest podany, to element
<script> ma pozostać pusty. Czyli tworzymy nowy plik skrypt.js, w którym zamieszczamy:
if (2 < 4) { alert("Witaj!"); }
A pliku html zamiast tamtego skryptu piszemy:
<script src="skrypt.js" type="text/javascript"></script>
4. Zmień teraz plik html, żeby miał postać:
<?xml version="1.0" encoding="iso-8859-2" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl"
dir="ltr">
<head>
<title>Moj pierwszy skrypt JS w XHTML</title>
<meta http-equiv="Content-Type" content="application/xhtml+xml;
charset=iso-8859-2"/>
<meta http-equiv="Content-Language" content="pl"/>
<script src="skrypt.js" type="text/javascript"></script>
<link rel="stylesheet" href="skin.css" type="text/css" />
</head>
<body>
<div onclick="wyswietl('1');">Kliknij pierwszą warstwę</div>
<div onmouseover="wyswietl('2');">Najedź na drugą warstwę</div>
<div ondblclick="wyswietl('3');">Kliknij dwa razy trzecią warstwę</div>
</body>
</html>
W pliku skrypt.js zapisz poniższą funkcję:
function wyswietl(a) {
alert("Warstwa " + a);
}
Ściągnij też z materiałów plik skin.css i umieść go w folderze z plikiem html.
Sprawdź działanie strony w przeglądarce.
Kiedy zachodzi jakieś zdarzenie (ang. event) można kazać przeglądarce wywołać odpowiednią
funkcję, która je obsłuży (ang. event handler). Zdarzenia to wszystko co zachodzi w związku z
obiektami JavaScript (np. window) i elementami XHTML. Zdarzenia generuje np. najechanie
myszą i kliknięcie na element, wybranie elementu formularza, koniec ładowania strony, itp.
Niektóre zdarzenia:
● click - element został kliknięty myszą
Który przycisk został kliknięty można sprawdzić w obiekcie event. Przeglądarki wywołują
to zdarzenie również, gdy użytkownik aktywuje element z klawiatury. W przypadku
elementów formularza kliknięcie wywołuje również bardziej specyficzne zdarzenia jak
zmiana stanu (change) lub wysłanie dokumentu (submit) — w takim przypadku lepiej jest z
nich skorzystać, zamiast z ogólnego kliknięcia.
● dblclick - podwójne kliknięcie na element
●
●
●
●
mouseover i mouseout - kursor myszy odpowiednio najechał na element lub zjechał z niego
Te zdarzenia są przydatne do pokazywania dynamicznych menu i „dymków”, ale działa
tylko, gdy użytkownik używa myszy (niezależne od urządzenia są focus i blur). Dla
ułatwienia obsługi warto jest nieco opóźnić ukrywanie.
keypress - wciśnięcie klawisza (analogiczne do click).
load i unload - zachodzą na <body>, gdy dokument zostanie załadowany do końca (load) i
gdy użytkownik zamknie lub przejdzie do innego dokumentu (unload).
Przeglądarki mogą blokować lub ograniczać działanie unload (broniąc się przed złośliwymi
skryptami), dlatego nie można na nim polegać.
submit - Wysłanie formularza
Dodaj teraz jeszcze jedną warstwę, po zjechaniu z której myszką, wyświetli się jakiś
komunikat.
5. Zmień teraz w pliku html warstwy, dodając poszczególnym warstwom id oraz w funkcji
wyswietl zmień argument na this, np.:
<div id="pierwsza" onclick="wyswietl(this);">Kliknij pierwszą
warstwę</div>
W analogiczny sposób zmień pozostałe warstwy. A funkcję wyswietl podmień na poniższą:
function wyswietl(e) {
alert("Warstwa " + e.id);
}
Jak teraz działa skrypt?
to referencja do obiektu, na rzecz którego została wywołana metoda lub obiekt, który
wywołał zdarzenie.
this
6. Pod wszystkimi warstwami dodaj kolejną, z id=”ile”, wpisz do niej dowolny tekst, zaś w
poprzednich warstwach podmień funkcję wyswietl(this) na zdarzenie(this), Dopisz funkcję
zdarzenie i zmienne i1, i2, i3 do pliku skrypt.js:
var i1 = 0;
var i2 = 0;
var i3 = 0;
function zdarzenie(e) {
switch(e.id) {
case "pierwsza": i1++; break;
case "druga": i2++; break;
case "trzecia": i3++; break;
}
document.getElementById("ile").innerHTML='Warstwa 1 ma zdarzeń:
'+i1+'<br />Warstwa 2 ma zdarzeń: '+i2+'<br />Warstwa 3 ma zdarzeń:'+i3;
;
}
Wykorzystany jest tutaj funkcja getElementById, która zwraca nam element identyfikowany
przez nas po id, oraz atrybut elementu innerHTML, który pozwala zmieniać html wewnątrz
danego taga. W ten sposób możemy dynamicznie zmieniać treść strony.
Napisz teraz własną funkcję, która będzie podmieniała tekst w pierwszej warstwie po
kliknięciu jej na „Już kliknąłeś tutaj”.
7. Javascript pozwala również na dynamiczną zmianę stylu danego elementu.
Zmień teraz warstwę drugą na:
<div id="druga" onmouseover="zdarzenie(this);zmienstyl(this);"
onmouseout="powrot(this);">Najedź na drugą warstwę</div>
I w pliku skrypt.js dodaj dwie funkcje:
function zmienstyl(e) {
e.style.backgroundColor='#ff0';
}
function powrot(e) {
e.style.backgroundColor='white';
}
Samodzielnie teraz dodaj nową funkcję do pozostałych warstw tak, aby po najechaniu na nie
myszką kolor czcionki danej warstwy zmieniał się na czerwony i pozostawał taki aż
najedzie się myszką na inną warstwę.
8. Dodatkowym atrybutem stylu, który może się przydać jest visibility. Dodaj poniższe
warstwy do pliku html:
<div class="menu">
<div id="m1" onclick="ukryj(this);">Ukryj pierwszą</div>
<div id="m2" onclick="ukryj(this);">Ukryj drugą</div>
<div id="m3" onclick="ukryj(this);">Ukryj trzecią</div>
</div>
Natomiast do pliku skrypt.js dodaj kolejną funkcję:
function ukryj(e) {
switch(e.id) {
case "m1":a=document.getElementById("pierwsza");break;
case "m2":a=document.getElementById("druga");break;
case "m3":a=document.getElementById("trzecia");break;
}
if(a.style.visibility!='hidden') {
a.style.visibility='hidden';
}
}
Dodaj teraz do funkcji ukryj(e) opcję, żeby jeśli dana warstwa jest już ukryta, to po
kliknięciu kolejny raz pokazywała ją (visible) oraz tekst w warstwach m1,m2,m3 zmieniał
się odpowiednio: „Pokaż warstwę”, „Ukryj warstwę”.
9. Za pomocą JavaScript można w pełni kontrolować formularze na stronach, np. sprawdzać
poprawność danych umieszczonych w formularzach, zmieniać zachowanie elementów
formularza (np. pozwalać na wpisywanie tylko cyfr w polu tekstowym) oraz dynamicznie
pokazywać i ukrywać jego części.
Utwórz teraz nowy plik html, który będzie zawierał formularz:
<?xml version="1.0" encoding="iso-8859-2" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl"
dir="ltr">
<head>
<title>Formularz</title>
<meta http-equiv="Content-Type" content="application/xhtml+xml;
charset=iso-8859-2"/>
<meta http-equiv="Content-Language" content="pl"/>
<script src="skrypt2.js" type="text/javascript"></script>
<link rel="stylesheet" href="form.css" type="text/css" />
</head>
<body>
<div><form id="fff" action="lab_js_form.html" onsubmit="return
sprawdz(this);">
<fieldset><legend>Formularz</legend>
<p><label for="imie">Imię:</label><input type="text" name="imie" id="imie"
value="Franciszek" /></p>
<p><label for="nazwisko">Nazwisko:</label><input type="text"
name="nazwisko" id="nazwisko" /></p>
<p><label for="email">E-mail:</label><input type="text" name="email"
id="email" /></p>
<p><label for="haslo">Hasło:</label><input type="password" name="haslo"
id="haslo" /></p>
<p><label for="haslo2">Powtórz hasło:</label><input type="password"
name="haslo2" id="haslo2" /></p>
<p><label for="dzien">Data urodzenia:</label><input type="text"
name="dzien" id="dzien" class="s" />
<select name="miesiac" id="miesiac">
<option value="0">--</option>
<option value="1">styczeń</option>
<option value="2">luty</option>
...
<option value="12">grudzień</option>
</select>
<input type="text" name="rok" id="rok" class="s ml0" />
</p>
<p><input type="submit" name="koniec" id="koniec" value="Wyślij"
class="button" /></p>
</fieldset>
</form>
</div>
</body>
</html>
Ściągnij kolejny css: form.css oraz utwórz nowy plik skrypt2.js, w którym będą zapisane
funkcje JS:
function sprawdz(f) {
if (f.elements["haslo"].value!="")
if (f.elements["haslo"].value==f.elements["haslo2"].value)
return true;
else alert("Powtórz to samo hasło");
else alert("Wpisz hasło");
return false;
}
Zauważ, że każdy element formularza ma dwa atrybuty: id i name. Id wykorzystujemy przy
odwoływaniu się do elementu jako składowej xhtmla (np.
document.getElementById('haslo')), natomiast atrybut name pozwala nam odwołać się do
elementów formularza (np. document.forms['fff'].elements['haslo']), a następnie pod takimi
nazwami wartości przekazywane są na stronę serwera.
Powyższy formularz przed wysłaniem (onsubmit) zostanie sprawdzony przez funkcję
sprawdz(f), gdzie w f przekazywany jest odnośnik do formularza. Jeśli funkcja zwróci false
formularz nie zostanie wysłany.
Powyższa funkcja sprawdza wyłącznie czy hasło nie jest puste, a jeśli nie, czy powtórne
hasło jest takie samo.
10. Rozbuduj funkcję sprawdz(f), tak żeby sprawdzała czy pola: imię, nazwisko i email nie są
puste, a także czy adres email jest sensowny (*@*.* gdzie * to dowolny znak). Sprawdź
także, czy dzień i rok urodzenia to cyfry i czy rok jest sensowny (nie mniejszy niż 1900, nie
większy niż aktualny).
11. Dodaj teraz dodatkowe elementy w formularzu: jeden (przed datą urodzenia), w którym
będzie się zaznaczało płeć (element select, checkbox albo radio), a drugi początkowo
niewidoczny – nazwisko panieńskie. Jeśli użytkownik wybierze płeć – kobieta (zdarzenie
onchange dla selectu albo onclick dla radio/checkbox), ukryj element odnoszący się do daty
urodzin (document.getElementById('name').style.visibility = 'visible' lub 'hidden'), a pokaż
element: nazwisko panieńskie. Odwrotnie jeśli wybrana zostanie płeć – mężczyzna.
Funkcja sprawdz(f) ma działać tak samo jak w punkcie 9.
Strona ma być zgodna ze standardem xhtml 1.0 (http://validator.w3.org).