Co to jest JavaScript?1 JavaScript a Java

Transkrypt

Co to jest JavaScript?1 JavaScript a Java
JavaScript - wprowadzenie -9h
1.
2.
3.
4.
5.
6.
7.
8.
9.
Co to jest JavaScrit
JavaScript a Java
Umieszczanie skryptu na stronie
Kod źródłowy zagnieżdżony w HTML
Kod źródłowym umieszczony w oddzielnym pliku
Jak zadbać o przeglądarki nie obsługujące JavaScript
Komentarze do kodu
Instrukcje dokument.write
Zmienne i operatory
Co to jest JavaScript?1
JavaScript jest językiem skryptowym służącym do tworzenia niewielkich programów
rozszerzających możliwości języka HTML w zakresie opisu stron WWW.
JavaScript jest to język, za pomocą można ożywić statycznie strony WWW (jeżeli nie liczyć
animowanych obrazków, obiektów Flash, filmików, itp.). Obecnie jest on wspierany przez
wszystkie liczące się na rynku przeglądarki internetowe. Jest to język obiektowy , o składni
wywodzącej się z języka C++.
JavaScript a Java
JavaScript jak sama nazwa wskazuje ma wiele wspólnego z językiem programowania Java,
jednakże nie należy tych dwóch jezyków mylić. Java jest w pełni obiegowym językiem
programowania, za pomocą którego można tworzyć skompilowane aplikacje niezależnie od
platformy sprzętowej. Poniżej zostały przedstawione najważniejsze różnice pomiędzy
językami Java i JavaScript.
JavaScript
Java
Język interpretowany na komputerze
klienta
Język kompilowany do tzw. b-kodu, wykonywanego
następnie za pomocą wirtualnej maszyny Javy na
komputerze klienta
Język oparty na predefiniowanych
obiektach, niepozwalający jednak na
stosowanie mechanizmów
programowania obiektowego jak np.
dziedziczenie
Język zorientowany obiektowo z obsługą wszystkich
mechanizmów obiektowości
Kod programu jest zagnieżdżony w
Kod programu jest niezależny od kodu HTML
1
http://eduzone.republika.pl/kurs_java_script/wstep.html#czym_jest_javascript
http://javascript.rzeźniczak.pl/01lekc1.php
1
kodzie HTML
i znajduje się w oddzielnych plikach
Zmienne i ich typ nie muszą być
deklarowane przed użyciem
Zmienne i ich typ muszą być zadeklarowane przed
ich użyciem w programie
Odwołania do obiektów i funkcji są
wykonywane podczas uruchamiania
programu
Wszystkie odwołania do obiektów i funkcji są
sprawdzane na etapie kompilacji
Ze względów bezpieczeństwa nie ma
możliwości zapisu na dysk twardy
Ze względów bezpieczeństwa aplety,
(w przeciwieństwie do aplikacji) nie mają
możliwości zapisu na dysk twardy
Co będzie potrzebne?
Przede wszystkim przynajmniej podstawowa znajomość języka HTML. Do pisania samego
kodu wystarczy Notatnik, chociaż osobiście polecam edytory) Oczywiście należy mieć
zainstalowaną przeglądarkę WWW: Microsoft Internet Explorer, Netscape Navigator, Opera
lub Mozilla.
Umieszczanie skryptu na stronie
1. Kod źródłowy zagnieżdżony w HTML.
Kod JavaScript musi być zawarty pomiędzy znacznikami HTMLa <script> i </script>:
//dla HTML5
<script>
...instrukcje skryptu
</script>
//dla HTML4
<script type="text/javascript">
...instrukcje skryptu
</script>
Dodatkowymi atrybutami, które możemy użyć dla tego znacznika, są:
• charset="..." - który ustawia kodowanie dla skryptu. Najlepiej używać kodowania UTF-8
<script type="text/javascript" charset="UTF-8">
...
</script>
•
defer="defer" - powoduje rozpoczęcie wykonywania skryptów dopiero po załadowaniu całej
strony (stosowane dla IE)
<script type="text/javascript" defer="defer">
...
</script>
•
src="..." - podaje adres pliku ze skryptami js
<script type="text/javascript" src="..."></script>
2
Jedna strona może zawierać wiele skryptów, które można zawierać zarówno w
sekcji body jak i head. Przyjmuje się o ile to możliwe należy korzystać z sekcji
head i nie przeplatać kodu html z kodem JavaScript.
Kod HTML strony używającej JavaScript wygląda więc następująco:
<html>
<head>
<script type="text/javascript">
kod skryptu
</script>
<script type="text/javascript">
kod skryptu
/* może być więcej rozgraniczonych znacznikami <script> kodów na jednej stronie */
</script>
</head>
<body>
<script type="text/javascript">
tu - w dowolnym miejscy sekcji BODY - też można umieścić kod źródłowy skryptu
</script>
</body>
</html>
2. Kod źródłowy zamieszczony w oddzielnym pliku.
Bardzo dobrą praktyką jest wielokrotne wykorzystywanie napisanego wcześniej kodu. Aby
pozbyć się problemu każdorazowego przeszukiwania dokumentów, otwierania, kopiowania
i wklejania, kod źródłowy skryptu można umieścić w osobnym pliku. Jest to plik tekstowy
o rozszerzeniu *.js, a kod skryptu pisany jest już bezpośrednio, bez znaczników <script>.
O tym, że kod źródłowy jest w pliku zewnętrznym informujemy przeglądarkę wykorzystując
atrybut src:
<script type="text/javascript" src="nazwa_pliku.js"></script>
Jak zadbać o przeglądarki nie obsługujące JavaScriptu?
Mimo, że prawie wszystkie używane dziś przeglądarki nie będą miały problemu z kodem
naszych skryptów - to nie zaszkodzi, jeżeli zadbamy o użytkowników, którzy takiego
komfortu nie mają. Żeby oszczędzić im trudnych do przewidzenia zachowań przeglądarki lub
komunikatów o błędach, kod umieszcza się w HTML-owych znacznikach komentarza:
3
<!-- komentarze
nie wyświetlane na stronie
-->
Dodatkowo przed znacznikiem zamykającym komentarz dodaje się dwa znaki "/", żeby
zadbać o Netscape Navigatora.
Można dodatkowo poinformować użytkowników, że strona zawiera skrypty, które nie zostały
wykonane przez ich przeglądarkę. W tym celu stosuje się znaczniki <noscript>.
Uwzględniając wszelkie powyższe wskazówki, szablon naszej strony HTML będzie wyglądał
następująco:
<html>
<head>
<script type="text/javascript">
<!-- ukrywamy kod przed nieznającymi nas przeglądarkami
kod skryptu
// koniec skryptu - koniec ukrywania -->
</script>
</head>
<body>
<noscript>
Twoja przeglądarka nie obsługuje JavaScriptu.
Aby zobaczyć stronę w pełnej funkcjonalności, zainstaluj inną przeglądarkę:
Internet Explorer, Netscape Navigator, Mozilla, Opera...
</noscript>
kod HTML strony
</body>
</html>
Komentarze do kodu
Bardzo pomocna rzecz, która ułatwia zorientowanie się w kodzie, który gdzieś kiedyś
stworzyliśmy. Komentarze towarzyszą wszystkim językom programowania, a ponieważ
i JavaScript umożliwia ich stosowanie, będziemy je umieszczali obok zawiłych instrukcji
naszych skryptów.
Mamy do wyboru dwa typy komentarzy:
liniowy:
4
Zaczyna się od dwóch ukośników a kończy przy przejściu do następnej linii. Oznacza to, że
przeglądarka zignoruje wszystko za znacznikiem // aż do końca linii, w której znacznik ten
występuje.
blokowy:
Rozpoczyna się od sekwencji: /* a kończy sekwencją: */. Oznacza to, że może on ciągnąć się
przez wiele linii, przy czym niemożliwe jest jego zagnieżdżanie (czyli stosowanie jednego
komentarza w innym).
Dzięki komentarzom, możemy poinformować przeglądarkę, że nie obsługuje skryptów nie
używając znacznika <noscript>. Powyższy szablon zmieni się na:
<html>
<head>
<script type="text/javascript">
// Twoja przeglądarka nie obsługuje JavaScriptu.
/* Aby zobaczyć stronę w pełnej funkcjonalności, zainstaluj inną przeglądarkę:
Internet Explorer, Netscape Navigator, Mozilla, Opera... */
<!-- ukrywamy kod przed nieznającymi nas przeglądarkami
kod skryptu
// koniec skryptu - koniec ukrywania -->
</script>
</head>
<body>
kod HTML strony
</body>
</html>
W takiej sytuacji, jeżeli przeglądarka obsługuje JavaScript, będzie wiedziała, że pierwsze trzy
linie kodu są komentarzami i nie wyświetli ich. W przeciwnym razie, znacznik <script>
zostanie zignorowany i wyświetlone zostanie wszystko aż do początku komentarza HTML czyli <!--. Polecam jednak stosowanie pierwszego scenariusza - stosowanie <noscript>,
ponieważ przeglądarki tekstowe - takie jak lynx - rozpoznają znaczniki komentarza JavaScript
(które są identyczne w wielu innych językach programowania jak Java i C++) i nie wyświetlą
komunikatu, który chcemy przekazać użytkownikowi.
Znacznik <NOSCRIPT>
Z pomocą komentarzy możemy również poinformować użytkownika przeglądarki
nieobsługującej JavaScript, że strona taki skrypt zawiera, tylko nie został wykonany. Kod,
5
który po wczytaniu do przeglądarki nieobsługującej JavaScript wyświetli stosowny
komunikat może mieć postać:
<HTML>
<HEAD>
<meta http-equiv="Content-type" content="text/html;charset=ISO-8859-2">
</HEAD>
<SCRIPT language = "JavaScript">
<!-- Ukrycie przed przeglądarkami nieobsługującymi JavaScript
// Twoja przeglądarka nie obsługuje JavaScript.
// Sugerujemy użycie przeglądarki Microsoft Internet Explorer lub Natscape
Navigator.
document.write("Ten tekst został napisany dzięki JavaScript")
// Koniec kodu JavaScript -->
</SCRIPT>
<BODY>
</HTML>
Przeglądarka nieobsługująca skryptów po napotkaniu nieznanej sobie etykiety <SCRIPT>
ignoruje ją, następnie wyświetla dwa kolejne wiersze traktując je jako zwykły HTML.
Następne wiersze są dla niej komentarzem, wiec je pomija. Natomiast dla przeglądarki
obsługującej skrypty komentarzem są dwa wiersze następujące po etykiecie <SCRIPT> i to
one są pomijane, natomiast kod document.write("Ten tekst został napisany dzięki
JavaScript"); jest interpretowany i wykonywany.
Ponadto przeglądarki Netscape Navigator oraz Internet Explorer, od wersji 3.0, akceptują
dodatkowy znacznik <NOSCRIPT>. Wówczas tekst, który ma być wyświetlony w przeglądarce
nieobsługującej skryptów umieszamy pomiędzy znacznikami <NOSCRIPT> i </NOSCRIPT>
<HTML>
<HEAD>
<meta http-equiv="Content-type" content="text/html;charset=ISO-8859-2">
</HEAD>
<SCRIPT language = "JavaScript">
<!-- Ukrycie przed przegladarkami nieobsługującymi JavaScript
document.write("To jest tekst napisany dzięki JavaScript")
// Koniec kodu JavaScript -->
</SCRIPT>
<NOSCRIPT>
Twoja przeglądarka nie obsługuje JavaScript.
Sugerujemy użycie przeglądarki Internet Explorer lub Natscape Navigator.
</NOSCRIPT>
<BODY>
</BODY>
</HTML>
6
Przykładowy skrypt:
Instrukcja document.write
Instrukcja document.write()pozwala wyświetlić tekst w oknie przeglądarki. document to
obiekt, który reprezentuje aktualną stronę, write to funkcja działająca na obiekcie document
i wyświetlająca tekst na ekranie. Tekst podajemy jako argument w nawiasach: ("Jakiś tam
tekst"). Ogólnie można zapisać obiekt.metoda(argumenty metody)
Taki ciąg jest instrukcją i powinien zostać zakończony średnikiem. W tym przypadku nie jest
to konieczne, lecz gdy chcemy zapisać kilka instrukcji użycie średnika staje się niezbędne:
document.writeln("Witaj Wędrowcze");
document.write("na tej stronie");
Funkcja writeln() dziala tak samo jak write(), przy czym na końcu wyświetlonego ciągu
znaków dodaje znak przejścia do nowego wiersza. Warunkiem poprawnego działania jest
ujęcie całości kodu pomiędzy znacznikami <PRE> i </PRE>, czyli w bloku tekstu
preformatowanego.
<HTML>
<HEAD>
<meta http-equiv="Content-type" content="text/html;charset=ISO-8859-2">
</HEAD>
<PRE>
<SCRIPT language = "JavaScript">
document.writeln("<b>Ten tekst został napisany</b>");
document.write("<b>dzięki JavaScript</b>")
7
</SCRIPT>
</PRE>
<BODY>
A to jest już normalny dokument HTML
</BODY>
</HTML>
Efekt działania będzie następujący:
Okno dialogowe
Pokażemy teraz jak wyświetlić na ekranie okno dialogowe z zapytaniem lub informacją
o wystąpieniu jakiegoś zdarzenia. Do wyświetlenia okna informującego użytkownika
owystąpieniu zdarzenia, najczęściej chodzi o sytuację, w której wystąpił błąd, używamy
metody alert(). Komunikat, który jest tekstem wyświetlonym w okienku ujmujemy
w nawiasy i cudzysłowy. W tego typu okienku mamy do dyspozycji jedynie przycisk OK.
<SCRIPT language = "JavaScript">
<!-- Ukrycie przed przegladarkami nieobsługującymi JavaScript
alert("To jest właśnie okno dialogowe")
// Koniec kodu JavaScript -->
</SCRIPT>
Działanie skryptu można wypróbować klikając na poniższy przycisk.
Jeśli chcemy wyświetlić okno dialogowe z przyciskami OK i Cancel/Anuluj stosujemy
metodę confirm
<SCRIPT language = "JavaScript">
<!-- Ukrycie przed przegladarkami nieobsługującymi JavaScript
confirm("\nJeśli się zgadzasz kliknij OK\n \nJeśli rezygnujesz wciśnij
Anuluj")
// Koniec kodu JavaScript -->
</SCRIPT>
8
Wykorzystaliśmy tutaj obiekt button, czyli klasyczny przycisk, który jest elementem
formularza. Jego naciśnięcie spowodowało wyświetlenie okna informacyjnego.
Zmienne i operatory
Elementy języka JavaScript
var nazwa_zmiennej
Nazwy zmiennych zaczynamy od litery i pozostajemy wierni zasadzie, że składa się ona
z liter, cyfr i znaku podkreślenia _. Dodatkowo dbamy o to, żeby nazwa reprezentowała coś
sensownego - czyli była samotłumacząca się - żebyśmy w przyszłości nie zastanawiali się, co
to za zmienna i po co była użyta w kodzie.
var imie="Janek" // zmienna typu string
var wiek=20 // zmienna typu integer
document.write("Nasz gość ma na imie "+imie+".")
document.write(imie+" ma "+wiek+" lat")
Zmienne
W języku JavaScript do dyspozycji mamy cztery typy danych:
liczbowy
służy do reprezentowania wszelkiego rodzaju liczb; dopuszczalne są trzy systemy notacji:
•
•
•
system dziesiętny
system ósemkowy
system szesnastkowy
wartości logiczne
zmienne tego typu mogą przyjmować tylko dwie wartości: TRUE i FALSE; używane przy
konstruowaniu wyrażeń logicznych, porównywania danych, wskazania, czy dana operacja
zakończyła się sukcesem
łańcuchy znaków
dowolne ciągi znaków zawarte pomiędzy znakami cudzysłowów lub apostrofów
wartość NULL
9
daje w wyniku wartość zerową; może być pustym ciągiem tekstowym, albo liczbą o wartości
0; w przypadku null nie występuje żadna wartość, a zmienna tego typu nie jest
definiowana; JavaScript zwraca wartość null, jeśli zostaje wciśnięty przycisk Anuluj/Cancel.
Zmienne są to konstrukcje programistyczne, które pozwalają przechowywać dane. Każda
zmienna ma swoją nazwę, która ją jednoznacznie identyfikuje. W JavaScript zmiennych nie
musimy deklarować przed użyciem, każda zmienna może przyjmować dane z dowolnego
typu, ponadto typ danych przypisanych zmiennej może się również zmienić.
Rozpatrzmy przykład:
<HTML>
<HEAD>
<meta http-equiv="Content-type" content="text/html;charset=ISO-8859-2">
</HEAD>
<SCRIPT language = "JavaScript">
<!-- Ukrycie przed przeglądarkami nieobsługującymi JavaScript
var zmienna_1 = "Urodziłam się w ";
var zmienna_2 = 1979;
document.write("<H3>" + zmienna_1 + zmienna_2 +" roku </H3>");
// Koniec kodu JavaScript -->
</SCRIPT>
<BODY>
</BODY>
</HTML>
Po wczytaniu takiej strony ukaże się napis:
Przeanalizujmy:
1.
2.
3.
4.
5.
zadeklarowaliśmy dwie zmienne o nazwach zmienna_1 i zmienna_2
zmiennej zmienna_1 przypisaliśmy ciąg znaków Urodziłam się w
zmiennej zmienna_2 przypisaliśmy wartość liczbową 1979
zmiennych tych użyliśmy jako argumentów funkcji write()
poszczególne łańcuchy tekstowe połączyliśmy operatorem + aby otrzymać jeden, który
ukazał się na ekranie (tzw. konkatencja łańcuchów znakowych)
Javascript udostępnia metodę typeof(), dzięki której możesz sprawdzać typ danych:
10
var n = 3;
document.write( typeof(n) ) //wypisze się "number"
var s = "napis";
document.write( typeof(s) ) //wypisze się "string"
var b = true;
document.write( typeof(b) ) //wypisze się "boolean"
var u;
document.write( typeof(u) ) //wypisze się "undefined"
Wprowadzanie danych
Teraz zajmiemy się oknami dialogowymi, pozwalającymi na podanie pewnych danych przez
użytkownika. Potrzebna nam będzie tutaj funkcja prompt(). Zobaczmy:
Na ekranie pojawia się okno dialgowe pozwalające na podanie imienia przez użytkownika, a
po wpisaniu imienia i kliknięciu OK pojawia się kolejne z napisem Cześć (imię). Natomiast
gdy użytkownik wciśnie Anuluj, pojawia się komunikat z zapytaniem "Dlaczego nie chcesz
podać swojego imienia?". Zobaczmy w takim razie jak wygląda kod skryptu.
<HTML>
<HEAD>
<meta http-equiv="Content-type" content="text/html;charset=ISO-8859-2">
</HEAD>
<SCRIPT language = "JavaScript">
<!-- Ukrycie przed przegladarkami nieobsługującymi JavaScript
function nacisnij() {
var imie = prompt("Podaj swoje imię", "");
if (imie == null) {
alert("Dlaczego nie chcesz podać swojego imienia? :(");
}
else {
alert ("Cześć " + imie + " :-)");
}
}
// Koniec kodu JavaScript -->
</SCRIPT>
<BODY>
<form>
<input type="button" name="Button1" value="Naciśnij mnie"
onclick="nacisnij()">
</form>
</BODY>
</HTML>
Na początku deklarujemy zmienną imie i przypisujemy jej od razu wartość zwróconą przez
funkcję prompt(), czyli ciąg znaków wprowadzonych przez użytkownika lub wartość null.
Następnie za pomocą instrukcji if ... else sprawdzamy, czy wartość zmiennej imie jest
11
równa null. Jeśli tak, wykonany zostanie ciąg instrukcji występujący po if. W przeciwnym
przypadku wykonany zostanie blok instrukcji po else.
if (warunek logiczny) {
instrukcja do wykonania, jeśli warunek jest prawdziwy
}
else {
instrukcja do wykonania, jeśli warunek nie jest prawdziwy
}
Kod ten można oczywiście zmodyfikować, tak aby skrypt uruchamiał się zaraz po wczytaniu
strony, a tekst wyświetlił się na stronie, a nie w oknie dialogowym. Wówczas cały kod
umieszczamy przed znacznikiem <BODY>, pomijamy oczywiście funkcję nacisnij a zamiast
instrukcji alert używamy instrukcji wyświetlającej tekst na ekranie, czyli document.write:
<HTML>
<HEAD>
<meta http-equiv="Content-type" content="text/html;charset=ISO-8859-2">
</HEAD>
<SCRIPT language = "JavaScript">
<!-- Ukrycie przed przegladarkami nieobsługującymi JavaScript
var imie = prompt("Podaj swoje imię", "");
if (imie == null) {
document.write("Dlaczego nie chcesz podać swojego imienia? :(");
}
else {
document.write("Cześć " + imie + " :-)");
}
// Koniec kodu JavaScript -->
</SCRIPT>
<BODY>
</BODY>
</HTML>
Operatory
Zestawienie operatorów używanych w JavaScript:
Operatory Arytmetycze
Operator
+
Opis
Dodawanie
-
Odejmowanie
*
Mnożenie
/
Dzielenie
Przykład
x=3
x=x+4
x=4
x=6-x
x=3
x=x*5
10/5
Wynik
7
2
15
2
12
%
Modulo (reszta z dzielenia)
++
Zwiększanie o 1
--
Zmniejszanie o 1
9/2
4%3
12%8
8%2
x=2
x++
x=4
x--
4.5
1
4
0
x=3
x=3
Operatory przypisania
Operator
=
+=
-=
*=
/=
%=
Przykład
x=y
x+=7
x-=3
x*=y
x/=y
x%=y
Równoważne z
x=x+7
x=x-3
x=x*y
x=x/y
x=x%y
Operatory porównania
Operator
==
!=
>
<
>=
<=
Opis
jest równe
nie jest równe
jest większe
jest mniejsze
większe lub równe
mniejsze lub równe
Przykład
2==3 wynik:fałsz
2!=3 wynik:prawda
25>30 wynik:fałsz
2<3 wynik:prawda
25>=3 wynik:prawda
2<=3 wynik:prawda
Operatory logiczne
Operator
&&
Opis
i
||
lub
!
zaprzeczenie
Przykład
x=3
y=4
(x < 9 && y > 2)
wynik:prawda
x=3
y=4
(x==8 || y==6)
wynik:fałsz
x=3
y=4
13
!(x==y) wynik:prawda
Operacje na łańcuchach znaków
Występuje tu tylko jeden operator: +, który poznaliśmy przy wprowadzaniu zmiennych, gdy
łaczylismy poszczególne łańcuchy tekstowe:
var zmienna_1 = "Urodziłam się w ";
var zmienna_2 = 1979;
document.write("<H3>" + zmienna_1 + zmienna_2 +" roku </H3>");
Pierwsze skrypty:
Ćw.1.
Napisz poniższe skrypty:
a)
Ćw. 2 Deklaracja zmiennych:
<!-- Zadeklaruj dwie zmienne, przypisz im dowolne ciągi znaków
i wyprowadź je na ekran za pomocą funkcji write(). -->
Ćw.3. Komentarze:
Przepisz poniższy skrypt:
<SCRIPT LANGUAGE = "JavaScript">
<!-- Ukrycie przed przeglądarkami nieobsługującymi JavaScript-->
document.write ("Jaki miły mamy dzień!")
// Koniec kodu JavaScript -->
/*inny
14
komentarz*/
</SCRIPT>
Ćw.4. Napisz skrypt wyświetlający okno powitalne z wprowadzonym imieniem
Ćw. 5
Napisz skrypt wyświetlający dowolne okno dialogowe:
Przykład 1 zastosowania Javascript:
15
Ćwiczenie 6.
Zmienne:
Ćwiczenie 7.
16
Ćwiczenie 8 -instrukcja if
Ćwiczenie 9 –instrukcja else if
Ćwiczenie 10 instrukcja case
17
Ćwiczenie 11 – pętla for
a)
b)
Ćwiczenie 12
Wypisz liczby parzyste od 1 do 20
18
Ćwiczenie 13 petla do …while
Ćwiczenie 14. Definiowanie funkcji
Ćwiczenie 15. Funkcja zwracająca wartość
19
Ćwiczenie 16. Funkcje z wartością
a)
b)
20
Ćwiczenie 17
a)
b)
21
Instrukcje warunkowe:
Do stworzenia prostego skryptu wystarczy użyć kilku (lub więcej) instrukcji, które zostaną
wykonane sekwencyjnie (jedna po drugiej), tak jak były zapisane. W praktyce jednak takie
proste skrypty są rzadkością - zdecydowanie częściej w skrypcie trzeba wykonać (lub nie)
dany fragment kodu w zależności od tego czy określony warunek będzie spełniony (lub też
odwrotnie). Do tego celu właśnie służą instrukcje warunkowe.
Instrukcje warunkowe służą do decydowania który fragment kodu powinien zostać wykonany
w zależności od spełnienia określonych warunków; inaczej mówiąc służą do rozgałęzienia
ścieżki wykonywania skryptu.
Podstawową instrukcją warunkową jest instrukcja if. Wygląda ona następująco:
if (warunek)
instrukcja;
jest to dowolne wyrażenie zwracające wartość logiczną (typ Boolean), lub
wyrażenie które da się skonwertować na taki typ, czyli praktycznie wszystko. Instrukcja
jest to natomiast dowolna instrukcja JavaScript.
Warunek
Polecenie warunkowe if można zatem wykorzystać następująco:
if (a > 0)
alert("a jest większe od zera");
Często zdarza się że zamiast pojedynczej instrukcji trzeba wykonać grupę instrukcji. Aby to
zrobić, należy otoczyć je nawiasami klamrowymi { }:
if (a > 0)
{
22
alert("a jest większe od zera");
a = 0xCAFEBABE;
}
Zgrupowane w ten sposób instrukcje nazywa się także instrukcją złożoną.
Instrukcja if posiada także możliwość umieszczenia po słowie kluczowym else instrukcji
(lub grupy instrukcji), która zostanie wykonana w przypadku gdy warunek nie będzie
spełniony:
if (a == 0)
alert("a jest równe zero");
else
alert("a jest różne od zera");
W niektórych przypadkach trzeba sprawdzić kilka różnych warunków, i wykonać
odpowiednie instrukcje dla każdego z nich, np. wyświetlić jaki jest znak liczby. W takim
przypadku można instrukcję else umieścić bezpośrednio po if:
if (a == 0)
alert("a
else if (a >
alert("a
else
alert("a
jest równe zero");
0)
jest większe od zera");
jest mniejsze od zera");
Innym popularnym rozwiązaniem w skryptach JavaScript jest uzależnienie wykonywanych
instrukcji od konkretnej wartości zmiennej lub parametru funkcji. Można to rozwiązać
poprzez wielokrotne porównywanie zmiennej z kolejnymi wartościami:
if (a == 0)
alert("a jest równe zero");
else if (a == 1)
alert("a jest równe jeden");
else if (a == 2)
alert("a jest równe dwa");
else if (a == 3)
alert("a jest równe trzy");
else
alert("a ma inną wartość");
Taka konstrukcja jest na tyle często używana, że doczekała się specjalnej instrukcji switch.
Wewnątrz niej poszczególne wartości umieszczone powyżej w instrukcjach if podaje się po
słowie kluczowym case. Jeżeli jest potrzeba wykonania instrukcji występujących w
powyższym przykładnie po ostatnim else, należy je umieścić po słowie kluczowym
default. Powyższy przykład wyglądał zatem będzie następująco z użyciem instrukcji
switch:
switch (a) {
case 0:
alert("a jest równe zero");
break;
case 1:
alert("a jest równe jeden");
break;
23
case 2:
alert("a jest równe dwa");
break;
case 3:
alert("a jest równe trzy");
break;
default:
alert("a ma inną wartość");
break;
}
Po instrukcjach case i default można umieścić kilka instrukcji bez konieczności otaczania
ich nawiasami klamrowymi { }.
Zwróć także uwagę na słowo kluczowe break umieszczone na końcu każdej z sekcji
wewnątrz instrukcji switch. Instrukcja ta mówi w którym momencie ma zostać przerwane
wykonywanie instrukcji switch. W przypadku gdyby jej nie było, wykonane byłyby także
instrukcje z znajdującej się poniżej sekcji case (lub default). Zapomnienie o wstawieniu
break jest przyczyną błędów w skryptach, które niekiedy mogą być trudne do wykrycia.
Dlatego wstawiaj zawsze tą instrukcję, a jeżeli masz sytuację że nie chcesz jej wstawiać,
umieść komentarz że brak instrukcji break jest zamierzony:
switch (a) {
case 0:
b += 2;
// Wykonaj takze instrukcje ponizej
case 1:
b *= 3;
alert("b = " + b);
break;
default:
alert("Niepoprawna wartość a!");
break;
}
Pętle
Zdarza się iż pewną operację lub sekwencję operacji warto byłoby wykonać wielokrotnie,
chociażby z tego względu aby zaoszczędzić sobie pisania. Owszem można skopiować dany
fragment skryptu tyle razy ile potrzeba, ale do jest kiepskie rozwiązanie. Po pierwsze tak
przygotowany skrypt jest trudny w utrzymaniu - wyobraź sobie tylko że skopiowałeś(aś) go
20 razy, i musisz w tych 20 miejscach nanieść jakąś poprawkę. Po drugie takie podejście nie
zawsze jest możliwe - czasami trzeba powtarzać daną operację, za każdym razem sprawdzając
czy określony warunek jest spełniony (np. wczytywać od użytkownika kolejne liczby aż do
momentu aż wpisze on liczbę zero).
Do rozwiązania tego typu problemów stosuje się pętle. Użycie pętli spowoduje że określony
fragment skryptu będzie wykonany określoną z góry ilość razy, lub też do momentu aż
podany warunek zostanie spełniony.
24
Pętla for
Posiada ona następującą składnię:
for ( inicjalizacja; test_logiczny; inkrementacja )
instrukcja;
lub
for ( inicjalizacja; test_logiczny; inkrementacja )
{
instrukcja1;
instrukcja2;
...
}
Jak pokazują powyższe przykłady, instrukcja for posiada trzy wyrażenia rozdzielone
średnikami które można podać wewnątrz nawiasów okrągłych: inicjalizacja,
test_logiczny i inkrementacja. Ich znaczenie jest następujące:
•
•
•
inicjalizacja - instrukcja wykonywana tylko raz na samym początku pętli. Zwykle używa
się jej do przypisania wartości początkowej do zmiennej która np. będzie zwiększana po
każdym obiegu pętli. Zmienna taka zwykle nazywana jest też licznikiem pętli;
test_logiczny - dowolny warunek który będzie sprawdzany przed każdym obiegiem pętli
(także tym pierwszym). W momencie gdy będzie on fałszywy, wykonywanie pętli zostanie
przerwane;
inkrementacja - instrukcja która będzie wykonywana po każdym obiegu pętli, a która ma
za zadanie np. zwiększenie wartości zmiennej pełniącej rolę licznika pętli.
Zatem pętla która ma wypisać kolejne cyfry od 0 do 9 może wyglądać następująco:
for (n = 0; n < 10; ++n)
document.write(n);
Zwróć uwagę na sposób w jaki testuję warunek zakończenia pętli - stosuję ostrą nierówność.
Oczywiście można też użyć nieostrej nierówności i uzyskać ten sam rezultat:
for (n = 0; n <= 9; ++n)
document.write(n);
W pewnych przypadkach gdy potrzebujesz coś wykonać 10 razy ale nie interesuje Cię
wartość licznika pętli możesz też liczyć od 1 do 10:
for (n = 1; n <= 10; ++n)
zrob_cos_ciekawego();
Osobiście polecam tą pierwszą wersję (z ostrą nierównością) z prostego powodu - tablice w
JavaScript są indeksowane od zera, i łatwo można odczytać ilość elementów w tablicy. Poza
tym konsekwentne stosowanie jednej wersji zmniejsza prawdopodobieństwo że napiszemy
pętlę która wykonuje się o jeden raz za mało lub za dużo, czyli uprości to uruchamianie
własnych skryptów.
25
Każdy z trzech elementów znajdujących się wewnątrz okrągłych nawiasów pętli for może też
być bardziej skomplikowanym wyrażeniem, np.:
for (n = wartosc_startowa(); czy_kontynuowac(n); n = nastepna_wartosc(n))
zrob_cos_smiesnego(n);
Można także napisać pętlę która posiada kilka liczników (lub inaczej mówiąc wykonuje kilka
instrukcji). Można to zrobić w częściach inicjalizacja i inkrementacja, poprzez
rozdzielenie wyrażeń za pomocą przecinka. Aby zrobić coś takiego w części test_logiczny,
należy użyć jednego z operatorów logicznych.
for (n = 0, k = 1; n < 10; ++n, k += 3)
document.write(n * k);
Pętle można też oczywiście zagnieżdżać - poniższy przykład po uruchomieniu wypisze
wszystkie iloczyny liczb od 0 do 9:
for (n = 0; n < 10; ++n)
for (k = 0; k < 10; ++k)
document.write(n * k);
Instrukcja for może wewnątrz nawiasów okrągłych posiadać trzy części: inicjalizacja,
test_logiczny i inkrementacja. Nie są one jednak obowiązkowe - każdą z nich można
pominąć. Należy jedynie pamiętać o pozostawieniu średników. Można nawet pominąć
wszystkie, w efekcie czego powstanie pętla nieskończona jak poniżej. Osobiście odradzam
tworzenie takich pętli. Ponieważ jednak nowoczesne przeglądarki posiadają zabezpieczenie
przed długo działającymi skryptami i po jakimś czasie zadają pytanie czy przerwać skrypt,
jeżeli to Cię bardzo ciekawi możesz go spróbować uruchomić.
for (;;)
document.write("pętla nieskończona<br>");
W praktyce taką pętlę stosuje się rzadko. Jeżeli już, to razem z instrukcjami które pozwalają
na jej przerwanie. Jedną z takich instrukcji jest break. Przy jej zastosowaniu można tak
zapisać znaną już pętlę wypisującą cyfry od 0 do 9:
for (n = 0; ; ++n)
{
if (n == 10)
break;
document.write(n);
}
Kolejną instrukcją którą warto poznać jest continue - jej wykonanie powoduje że pętla
natychmiast zaczyna wykonywać kolejną iterację (czyli wykonuje inkrementację, a następnie
sprawdza warunek kontynuacji pętli). Można w ten sposób np. wyświetlić tylko cyfry
parzyste:
for (n = 0; n < 10; ++n)
{
if (n % 2 != 0)
continue;
document.write(n);
}
26
Oczywiście w praktyce lepiej jest inkrementować licznik o 2 - powyższy przykład umieściłem
tylko dla zademonstrowania zastosowania komendy continue.
Pętla while
Pętla while posiada następującą składnię:
while ( test_logiczny )
instrukcja;
lub
while ( test_logiczny )
{
instrukcja1;
instrukcja2;
...
}
Jest ona funkcjonalnym odpowiednikiem następującej wersji pętli for:
for ( ; test_logiczny;
instrukcja;
)
Zachowuje się też identycznie jak podana wersja pętli for, czyli najpierw sprawdza czy
test_logiczny jest prawdziwy i jeżeli tak to wykonuje instrukcje, po czym powtarza to aż
test_logiczny stanie się fałszywy.
Taką pętlę stosuje się zwykle gdy nie występuje jawnie inicjalizacja pętli i/lub jej
inkrementacja, lub też są one bardziej złożone i przez to zapisanie ich w ramach instrukcji
for byłoby kłopotliwe.
Znany nam już przykład z wypisywaniem cyfr od 0 do 9 wygląda tak z zastosowaniem pętli
while:
n = 0;
while (n < 10)
{
document.write(n);
++n;
}
Wewnątrz pętli while można też stosować opisane wcześniej instrukcje break i continue.
Pętla do/while
Pętla do/while jest bardzo podobna do omówionej wcześniej pętli while. Posiada ona
następującą składnię:
do
instrukcja;
while ( test_logiczny )
27
lub
do
{
instrukcja1;
instrukcja2;
...
}
while ( test_logiczny );
W działaniu te dwie pętle różnią się momentem kiedy sprawdzana jest prawdziwość warunku
test_logiczny - pętla while robi to przed wykonaniem instrukcji, natomiast pętla
do/while robi to po. Oznacza to że gdy warunek będzie fałszywy już na początku pętli, to
wtedy pętla while nie wykona się ani razu, ale pętla do/while wykona się jeden raz.
W poniższych przykładach liczba 10 zostanie wypisana tylko w drugim przypadku:
n = 10;
while (n < 10)
{
document.write(n);
++n;
}
n = 10;
do
{
document.write(n);
++n;
}
while (n < 10);
Wewnątrz pętli while można też stosować opisane wcześniej instrukcje break i continue.
Pętla for/in
Pętla ta służy do łatwego wyliczania kolejnych elementów tablic i właściwości obiektów.
Posiada ona następującą składnię:
for (zmienna in tablica_lub_obiekt)
instrukcja;
lub
for (zmienna in tablica_lub_obiekt)
{
instrukcja1;
instrukcja2;
...
}
zmienna jest to nazwa zmiennej która ma być użyta jako licznik tej pętli.
tablica_lub_obiekt jest natomiast tablicą lub obiektem której/którego zawartość ma zostać
wyliczona przez pętlę. Pętla ta w trakcie wykonywania się będzie do zmiennej zmienna
przypisywać kolejne indeksy (klucze) tablicy. Przykładowo poniższy przykład wypisze
kolejno cyfry od zero do trzy:
28
tablica = Array( 'a', 'b', 'c', 'd' );
for (n in tablica)
{
document.write(n);
}
Aby wypisać to co znajduje się w tablicy pod każdym z indeksów (czyli kolejne literki),
trzeba dokonać niewielkiej modyfikacji tego kodu:
tablica = Array( 'a', 'b', 'c', 'd' );
for (n in tablica)
{
document.write(tablica[n]);
}
Oczywiście w tej pętli można też stosować instrukcje break i continue.
Funkcje
Upraszczając sprawę funkcje w JavaScript jest to sposób na nadanie nazwy fragmentowi
swojego skryptu, i możliwość późniejszego odwoływania się do niego z użyciem tej nazwy.
Szkielet funkcji wygląda następująco:
function NazwaFunkcji ( parametry )
{
instrukcja1;
instrukcja2;
...
}
jest to dowolna nazwa, która powinna spełniać takie same wymogi jak nazwy
zmiennych (czyli pierwszym znakiem może być litera lub znak podkreślenia; kolejne znaki
nazwy mogą być literą, cyfrą lub znakiem podkreślenia; nazwa nie może też być
zarezerwowanym słowem kluczowym). parametry jest to lista nazw parametrów, rozdzielona
przecinkami (nazwy parametrów również muszą spełniać wspomniane wcześniej
wymagania). Lista parametrów może być pusta (pomiędzy nawiasami okrągłymi wtedy nic
nie ma).
NazwaFunkcji
W ciele funkcji może być umieszczona dowolna liczba instrukcji. Nawiasy klamrowe są
obowiązkowe i nie można ich pominąć, nawet jeżeli funkcja zawiera tylko jedną instrukcję
(lub nawet nie zawiera żadnej instrukcji - w pewnych przypadkach takie funkcje które nic nie
robią też mogą być przydatne).
Własne funkcje wywołuje się identycznie jak funkcje wbudowane - po prostu podaje się
nazwę funkcji i w nawiasach okrągłych wartości parametrów.
Prosta funkcja i jej wywołanie może wyglądać następująco:
function Witaj(imie)
{
document.write("Witaj, " + imie);
29
}
Witaj("Daniel");
Funkcje mogą też zwracać pewną wartość. Do zwrócenia wartości z funkcji używa się
komendy return, po której podaje się wartość która ma zostać zwrócona z funkcji:
function Suma(a, b)
{
return a + b;
}
Ważną cechą instrukcji return jest to iż powoduje ona natychmiastowe przerwanie
wykonywania funkcji i powrót do miejsca w skrypcie z którego funkcja była wywołana. Z
tego też powodu możliwe jest także użycie komendy return bez podawania wartości która
ma zostać zwrócona z funkcji, co jest użyteczne gdy piszemy funkcję która ma tylko coś
zrobić (np. wypisać jakiś napis), ale nie ma zwracać żadnej wartości.
Poniższa funkcja drukuje wszystkie wartości z przedziału określonego parametrami, ale
kończy drukować jeżeli przekroczy liczbę 100.
function DrukujLiczby(a, b)
{
for (n = a; n <= b; ++n)
{
if (n >= 100)
return;
document.write(n);
}
}
Iteracja i rekurencja
Iteracja i rekurencja są to dwa sposoby rozwiązywania problemów gdzie występuje
konieczność wielokrotnego wykonywania pewnych operacji. Z iteracją mamy do czynienia
gdy do rozwiązania problemu jest zastosowana pętla wewnątrz której prowadzone są
właściwe obliczenia. Z kolei rekurencja polega na tym że funkcja wywołuje samą siebie, i w
ten sposób wykonywane są obliczenia. Oczywiście w tym drugim przypadku należy też
pamiętać aby określić warunek kiedy funkcja powinna bezpośrednio zwrócić wartość a nie
wywoływać się po raz kolejny. Bez tego obliczenia nie mogłyby się zakończyć!
Poniżej znajdują się dwa przykłady funkcji które liczą wartość silni podanej liczby naturalnej.
Dla tych co zapomnieli co to jest silnia przypominam że jest to iloczyn liczb od 1 do n, np. 3!
= 1 * 2 * 3 = 6. Dodatkowo 0! = 1.
Pierwsza funkcja liczy silnię w sposób iteracyjny:
function Silnia_I(n)
{
wynik = 1;
for (k = 1; k <= n; ++k)
{
wynik *= k;
}
30
return wynik;
}
Druga natomiast funkcja robi to samo, ale z wykorzystaniem rekurencji:
function Silnia_R(n)
{
if (n == 0)
return 1;
else
return n * Silnia_R(n - 1);
}
Przykład zastosowania funkcji ze zdarzeniami myszy
<script type="text/javascript">
//pod FF
function przesun(e){
var imgkur=document.getElementById("samochodzik");
switch(e.which){
case 83:imgkur.style.top=imgkur.offsetTop+20+"px";
break;
case 65:imgkur.style.top=imgkur.offsetTop-20+"px";
break;
case 90:imgkur.style.left=imgkur.offsetLeft-20+"px";
break;
case 87:imgkur.style.left=imgkur.offsetLeft+20+"px";
break;}
}
//pod IE
function przesun2(){
var imgkur=document.getElementById("samochodzik");
switch(window.event.keyCode){
case 83:imgkur.style.posTop+=20;
break;
case 65:imgkur.style.posTop-=20;
break;
case 90:imgkur.style.posLeft-=20;
break;
case 87:imgkur.style.posLeft+=20;
break;
}
}
//pod FF
function przesun9(e){
var imgkur=document.getElementById("samochodzik1");
switch(e.which){
case 73:imgkur.style.top=imgkur.offsetTop+20+"px";
break;
case 77:imgkur.style.top=imgkur.offsetTop-20+"px";
break;
31
case 74:imgkur.style.left=imgkur.offsetLeft-20+"px";
break;
case 76:imgkur.style.left=imgkur.offsetLeft+20+"px";
break;}
}
//pod IE
function przesun99(){
var imgkur=document.getElementById("samochodzik1");
switch(window.event.keyCode){
case 73:imgkur.style.posTop+=20;
break;
case 77:imgkur.style.posTop-=20;
break;
case 74:imgkur.style.posLeft-=20;
break;
case 76:imgkur.style.posLeft+=20;
break;
}
}
</script>
</head>
<body onload="alert('Opis poruszania się samochodzików za pomocą
klawiatury: niebieski: j-lewo,l-prawo,i-dół,m-góra; czerwony:a-gora,s-dół,
w-prawo, z-lewo')">
<img id="samochodzik" src="pep.jpg" alt="" width="129" height="98"
style="position:absolute" />
<img id="samochodzik1" src="sam1.jpg" alt="" style="position:absolute;
right:200px;" />
<!-- keypress- wciśnieto klawisz
keydown
keyup -->
<!-- adsx -->
<script type="text/javascript">
if(document.addEventListener){
document.addEventListener("keydown", przesun,true);}
else if(document.attachEvent){
document.attachEvent("onkeydown",przesun2);}
</script>
<script type="text/javascript">
if(document.addEventListener){
document.addEventListener("keydown", przesun9,true);}
else if(document.attachEvent){
document.attachEvent("onkeydown",przesun99);}
</script>
</body>
</html>
32

Podobne dokumenty