HTML lehe kasutajaga
suhtlemisvõimeliseks muutmiseks saab kasutada javaskripti. Tema abil saab
kasutaja poolt tekstiväljadesse ja mujale sisestatud andmeid töödelda,
reageerida hiire liigutustele ja vahetada pilte. Javaskript võimaldab ka
olemasolevate andmete põhjal uusi lehekülgi kokku panna. Kuna tegemist on
intepreteeritava keelega (s.t. brauser loeb ja täidab tekstina kirjutatud
korraldusi), siis toimib javaskript suhteliselt aeglaselt. Samas kuna
javaskripti programmid on enamasti lühikesed ning nad kasutavad juba varem
valmistatud ning optimeeritud tervikkäsklusi, siis intepretaatori töökiirus
programmi kulgu oluliselt ei mõjuta. Samuti käivitub Javaskripti intepretaator
suhteliselt kiiresti.
Javaskripti programmilõigud kirjutatakse HTML teksti
<script> ning </script> vahele. Samuti saab programmilõike tööle
panna sündmuste toimumisel (näiteks lehekülje avanemine, hiirevajutus nupul,
hiire sisenemine pildi piirkonda jne. ). Lihtsaim Javaskriptipoolne tervitus
näeks välja järgmine:
<html><head><title>Tervitus</title></head>
<body>
<script>
document.writeln("Tere");
</script>
</body></html>
Näitena lehekülg, mis
enese loomisel kirjutab sinna kakskümmend liitmisülesannet liidetavate
väärtustega kuni kümneni. Nagu java, nii ka javaskripti puhul loob käsk
Math.random() juhusliku arvu 0 ja 1 vahel. Korrutades selle kümnega ning
ümardades täisosaks saabki juhusliku arvu nulli ja kümne vahel.
<script>
document.writeln(Math.round(10*Math.random())+"+"+
Math.round(10*Math.random())+"="
);
</script>
Kahe arvu vahele tuleb
plussmärk, tehte lõppu võrdusmärk ning <br> tähistab reavahetust ja \n
HTMLi koodis järgmisele reale minekut. <script> on tavaline lehe osa nagu
muudki ning vajaduse korral saab nii enne kui pärast teda leheküljele
kirjutada.
<html><head><title>Liitmine</title></head>
<body>
<h2>Liitmisülesanded</h2>
<script>
for(i=0; i<20; i++){
document.writeln(Math.round(10*Math.random())+"+"+
Math.round(10*Math.random())+"=<br>\n"
);
}
</script>
</body></html>
Järgnevalt üksikasjalikum
seletus skriptijupi töö kohta. Nii nagu <title> ja </title> vahele
käib lehe ülaserva pealkiri, nii <script> ja </script> vahele
brauseris täidetav programmikood.
Algselt oligi selliselt käivitatavaks keeleks vaid Javaskript, kuid
aegamööda on sarnase kasutusega keeli juurde tulnud ning keele või versiooni
saab kindlaks määrata. Siin näites võiks kirjutada ka <script
language=“Javascript”> , kui kasutada aga Microsofti loodud VBScripti, siis
tuleks programmikoodi algusesse <script language="VBScript">.
Kui kasutada mõne kõrgema versiooni käske, mida vanemad brauserid ei mõista,
siis tuleb kirjutada <script language="Javascript1.2">.
Sellisel juhul kui brauser vastavat versiooni ei tunne, jätab ta vastava
programmilõigu tähele panemata.
Skripti on võimalik sisse
lugeda ka eraldi failist. See näeks välja nii:
<script src=liitmised.js>
</script>
Failis oleksid siis need
samad käsud, mis muidu lehe sees. Brauser lihtsalt paigutab nad lehe lugemise
esitamise käigus sinna kohale. Selline lugemine aitab muuta pikki skripte
sisaldavat HTML lehte lühemaks, samuti võimaldab ühte skripti mitmes kohas
kasutada, ilma et teda peaks mitmesse kohta kopeerima. Nõndamoodi saab ka vigu
kergemini parandada, sest kord tehtud parandused kajastuvad kõikjal ning
avastatud viga pole vaja teistes
tekstides eraldi parandada. Kuigi - kui selle eraldiseisva programmikesega
midagi peaks juhtuma, siis on rivist väljas kõik lehed mis teda kasutavad.
Samuti peab kopeerimisel hoolitsema, et see failike ikka kaasa saaks. Samuti on
Internet Exploreril mõnikord probleeme selliselt esitatud lõikude
sisselugemisel.
Mõned brauserid (näiteks
lynx) ei suuda üldse järgida Javaskripti käske. Nende tarvis loodi
<noscript> element. Siinsete ülesannete puhul võiks lehekülg näha välja
nii:
<script src=liitmised.js>
</script>
<noscript>
3+2=
4+5=
</noscript>
Sellisel juhul jäävad
skriptitu brauseri puhul ülesanded küll alati samaks, kuid nad on siiski
olemas, muul juhul puuduksid need sootuks, sest programmi puudumisel jääb ka
tema tulemus nägemata.
Et ka selliste brauserite
tarvis programmi abil lehti luua, on loodud teistsugused vahendid nagu näiteks
PHP, ASP, CGI, JSP, kus vajalik lõpptulemus arvutatakse välja serveris ning
brauseri ülesandeks on vaid seda kasutajale näidata.
Muutujate deklareerimine
Javaskriptis on vabatahtlik. Talle võib rahumeeli omistada töö käigus väärtuse, muretsemata, kas arvuti
sellenimelist muutujat juba tunneb või mitte. Kui vastavanimelist muutujat
varem polnud, siis see luuakse, vastasel juhul asendatakse vana väärtus uuega.
Ka andmetüüpidega käiakse küllalt vabalt ringi.
Vastavalt omistatavale väärtusele ennustab intepretaator tüübi. Nii
vabastatakse koodi kirjutaja mõtlemisest, kas tegemist on teksti või arvu või
millegi muuga, kuid eks igal asjal ole omad head ja vead.
Sisemiselt on siiski andmetüübid olemas. Sellest
sõltub, kuidas andmetega edaspidi käitutakse. Algul tähtsamateks tüüpideks on
arv (näiteks 16.5) ja sõne(nt. "kapsas"). Ka tunneb intepretaator
tõeväärtust (true/false), tühiväärtuseks on null (väikeste tähtedega), omistamata väärtust tähistab undefined ning struktuurseks tüübiks on massiiv ja muud
mitmesugused objektid.
Kui avaldises asuvad sõne ja arv kõrvuti, siis
võimalusel käisitletakse mõlemat osapoolt sõnena. Mõned näited:
avaldis tulemus
25+5 30
"25"+5 255
"25"+5+5 2555
eval("25")+5
30
"25"-5 20
"25"-"5" 20
25+5+"5" 305
Lahutamise puhul
muudetakse võimaluse korral ka sõned arvudeks, sest sellist tehet sõnede puhul
olemas pole. Viimase avaldise väärtuseks on 305, kuna kõigepealt liidetakse
vasakult paremale kokku 25+5 ning saadakse 30. Sellele tulemusele lisatakse
omakorda sõne "5" mis annabki kokku "305".
Täisarve saab lisaks
tavalisele kümnendesitusele sisestada ka kaheksand- ning
kuueteistkümnendsüsteemis. Esimesel juhul tuleb numbri ette kirjutada 0, teisel
0x. Nii et siin (nagu mujalgi sarnase esitusega keeltes) on 14, 016 ja 0xE
samaväärsed. Viimaseid läheb siiski vaja vaid eriolukordades nagu näiteks bititöötlus
.
Reaalarve saab vajadusel
esitada mantissi ja järguga ehk näiteks 1.73e5, mis lahtiseletatult tähendab
1,73 korda 10 viiendas astmes. Kümne aste võib olla negatiivne ning komaeelse
üksiku nulli võib soovi korral ära jätta, seega on Javaskripti intepretaatori
jaoks loetav ka .25e-2 , mis on sama kui
0.0025.
Sõne võib olla nii ühe- kui
kahekordsete jutumärkide vahel, nii et samaväärsed on 'kass' ja
"kass". Vaid alguses ja lõpus peab sama eraldaja olema. Mitmed
eradajad on tarvilikud näiteks kohtades, kus ühed märgid tähistavad kogu
käivitatavat käsku, teised aga trükitavat sõnet.
Näiteks: eval("document.writeln('kuku')");
Langjoone abil saab lisada
sõnesse erisümboleid. \n tähistab reavahetust, \t tabulaatorit, \' ühe- ning
\" kahekordset jutumärki, \\ langjoont ennast. Nii et c:\temp ekraanile
manamiseks tuleb kirjutada document.writeln("c:\\temp");.
Kolmekohalise numbrina langjoone taga saab anda edasi Latin-1 kodeeringus
sümboleid vastavalt koodile, \u järel neljakohaline number tähistab unicode
väärtust.
Massiiv tuleb kõigepealt
luua, seejärel saab temasse elemente paigutada. Näide:
kalad=new
Array();
kalad[0]="koha";
kalad[1]="siig";
Massiivi loomisel võib
sulgudes ette anda selle esialgse suuruse.
Muutuja luuakse, kui
temale omistatakse väärtus. Samuti võib muutuja luua, deklareerides ta käsuga
var. Kui sel juhul väärtust ei omistata, saab muutuja väärtuseks undefined.
Kord loodud muutuja on kasutatav kõikjal üle lehe. Teistelt lehtedelt saab selle
muutuja poole pöörduda vastavat lehte ümbritseva akna kaudu. Kui muutuja deklareerida alamprogrammis
käsuga var, siis saab teda kasutada vaid selle funktsiooni sees, mujal on ta
nähtamatu. Selliselt on võimalik eri alamprogrammides kasutada sama nimega muutujat
(näiteks i-d tsükliloendurina), muretsemata, et need üksteist segama hakkaksid.
Muutuja nimi peab algama tähe või alljoonega ning tohib sisaldada ka numbreid.
Harilikud tehtemärgid on +, -, *, /, kusjuures erinevalt
näiteks Javast tähistab jagamismärk alati murdarvulist jagamist, s.t. 5/2
tulemuseks on 2.5. Jäägi annab %, ehk 5%2=1.
Enamkasutatavate toimingute tarvis on loodud mitmeid
lihtsustusi. Muutuja väärtuse suurendamiseks ühe võrra tuleb tema järele
kirjutada 2 plussi. Seega lõigu
x=5;
x++;
document.writeln(x);
tulemusena kirjutatakse
välja kuus. Sama tulemuse saaks, kui x++ asemele kirjutada
x=x+1, mis ongi tavaline
pikem kirjutuskuju. Kuid sama soovi saab väljendada ka
x+=1 abil ning siin lõigus
annaks sama tulemuse ka
++x;
Kui x=x+1 asemel võib kirjutada x+=1, siis
analoogiliselt sobib x=x-1 asemele x-=1. Iseenesest küllalt pisike ja
tähtsusetu võimalus, kuid paljude omistuste ning pikkade muutujate nimede
korral muudab kirjutusvaeva vähemaks, kuigi esialgu võib kirjutuspildi segamini
lüüa. Samuti töötavad ka nt. x*=3 ja x/=2 ning x%=2 korrutamise, jagamise ning
jäägi võtmise juures.
Eelnevalt oli kirjas, et
käsk x++ suurendab muutuja x väärtust ühe võrra. Sarnaselt vähendab x-- x-i väärtust
ühe võrra. Neid käske võib kasutada ka teiste käskude sees:
var x=3;
document.writeln(x++);
document.writeln(x++);
kirjutab välja 3 ja 4.
Nagu näha, siin kõigepealt loetakse välimise käsu tarbeks muutuja väärtus ning
alles seejärel suurendatakse muutuja väärtust ühe võrra. Ka teistsugune
võimalus on olemas, et algul suurendatakse muutuja väärtust ja alles siis
küsitakse see. Selleks tuleb plussid (või miinused) kirjutada muutuja ette. Nii
et
var x=3;
document.writeln(x++);
document.writeln(++x);
kirjutab välja 3 ja 5.
Võrdlusi kasutatakse
enamasti tingimuslausete juures, kuid ka mujal, kus on vaja vastust tõene või
väär. Näide:
if(vanus<12){
document.writeln("osta
lapsepilet");
}
Tõeväärtust saab vajadusel
säilitada ka muutujas
vanus=10;
laps=(vanus<12);
if
(laps) {
document.writeln("osta
lapsepilet");
}
Sellest on kasu, kui
võrdlus on pikk ja seda tahetakse välja arvutada tingimuslausest eraldi. Samuti
on mõistlik võrdluse tulemust säilitada muutujas, juhul, kui seda läheb tarvis
mitmes kohas.
Kontrollimaks, kas kaks väärtust on võrdsed, tuleb
kasutada kahte võrdusmärki.
(vanus==13) //kas vanus on
võrdne kolmeteistkümnega
(vanus>=13) //kas vanus
on suurem või võrdne kolmeteistkümnega
(vanus<=13) //väiksem
või võrdne
(vanus>13) // suurem
(vanus!=13) // tulemus on
tõene juhul, kui vanus pole kolmteist.
Võrdlemise korral
teisendatakse võimaluse korral väärtused samasse tüüpi ning näiteks
(3=="3") annab tulemuseks tõese väärtuse. Et sama arvulise väärtuse
kuid erineva tüübiga andmeid erinevaks lugeda, selleks on Javaskripti
uuematesse versioonidesse lisatud kolme võrdusmärgiga võrdlus, mis annab tõese
vastuse vaid juhul kui nii muutujate tüüp kui sisu on sama, seega
(3==="3") annab väära tulemuse. Ka eitus on sarnane, (3!=="3")
annab tõese väärtuse.
Tingimusi saab grupeerida nagu näiteks, et nimi on
Priit ja vanus on väiksem kui 12. Javaskriptis näeks see välja, et
((nimi=="Priit") && (vanus<12)). Või jaoks tuleb kirjutada
|| ning sulgudega hoolitseda, et õiged asjad omavahel kokku käiksid.
If-lause
abil saab mingi tegevuse panna toimuma vaid tingimuse sobivuse korral. Näiteks:
if(vanus<12)
{
document.writeln("Osta
lapsepilet");
}
Vajaduse korral saab
lisada else-osa, mis täidetakse, kui tingimus pole täidetud:
if(vanus<12){
document.writeln("Osta
lapsepilet");
}
else {
document.writeln("Osta
täispilet");
}
Tingimuse alla kuuluva
üksiku käsu ümbert võib (kuid ei pruugi ning koodi loetavuse huvides pole
enamasti soovitav) käsugruppi ümbritsevad sulud ära võtta.
if(vanus<12)
document.writeln("Osta lapsepilet");
else
document.writeln("Osta täispilet");
Tingimuslausest on ka
lühem variant, nn. ternaarne operaator kujul
(tingimus)?
tegevus_tõesel_juhul : tegevus_muul_juhul. Näiteks:
tyyp=(vanus<12)?"lapse":"täis";
document.writeln("Osta
"+tyyp+"pilet.");
või
(vanus<12)?document.writeln("Osta
lapsepilet"):document.writeln("Osta täispilet");
või ka
document.writeln("Osta
"+((vanus<12)?"lapse":"täis")+"pilet");
Tsüklite ehk silmuste abil
saab tegevusi korduvalt esile kutsuda. Näiteks soovitakse midagi kirjutada
kümme korda või paluda senikaua ülesandele vastata, kuni tulemus sobib.
While-tsükli puhul kontrollitakse iga kord tsükli alguses, et kas seda on vaja
läbida. Jõudnud tsükli lõppu, minnakse uuesti algusse ja kontrollitakse, kas
läbitud käsud tuleb uuesti ette võtta. Ringist pääseb minema alles siis, kui
päises oleva tingimuse väärtuseks on väär. Kui juhtub, et sellist väärtust
sinna ei teki (näiteks kui järgnevas näites unustataks tsükliloendurit
suurendada), sel juhul programm jääbki tsüklisse (ning siin muudkui kirjutaks
a-sid).
Sama tulemuse saab for-tsükli abil veidi lühemalt
kirja panna. for-i päises semikoolonite vahel olevast kolmest käsust täidetakse
esimest tsüklisse sisenemist (enamasti algväärtustatakse tsüklimuutuja(d)).
Keskmise tingimuse järgi otsustatakse, kas tsükli sisu on vaja täita. Kolmas
käsk täidetakse alati pärast tsükli sisu läbimist, siin näites suurendatakse
tsüklimuutuja väärtust.
Alates Javaskripti versioonist 1.2 tuli juurde do ..
while tsükkel, kus jätkamise vajadust kontrollitakse pärast tsükli läbimist.
Sellisel juhul täidetakse tsüklis olevad käsud korra ka juhul, kui tingimus on
väär. Sellist tsüklit on hea kasutada inimeselt vastuse pärimisel. Näiteks
programm ei välju tsüklist enne, kui ta on numbrilise väärtuse oma sünniaasta
kohale sisestanud.
<html><head><title>Tsüklid</title></head>
<body>
<script>
i=0;
while(i<10){
document.write("a");
i++;
}
</script>
<script>
for(i=0; i<10; i++){
document.write("b");
}
</script>
<script language="Javascript1.2">
i=0;
do{
document.write("c");
i++;
}while(i<10);
</script>
</body>
</html>
Objekti omaduste läbi
lappamiseks on for .. in tsükkel, mille abil saab ükshaaval kõik vastava
objekti omadused kätte ning siis on nendega võimalik midagi ette võtta.
<html><body>
<script>
var koer=new Object();
koer.vanus=12;
koer.nimi="Muri";
for(omadus in koer){
document.writeln("Koera "+omadus+" on
"+koer[omadus]+"<br>");
}
</script>
</body></html>
trükib välja
Koera vanus on 12
Koera nimi on Muri
Alamprogrammiks on käskude komplekt, mida saab eraldi
välja kutsuda. Nende abil saab programmi põhiosa lühendada ja selgemaks muuta,
eraldades pikemad omaette tegevused mujale ning jättes peaprogrammi vaid ühe
käsu nende täitmiseks. Javaskriptis nimetatakse kõiki alamprogramme
funktsioonideks. Näiteks Pascalis ja Visual Basicus nimetatakse funktsioonideks
vaid neid alamprogramme, mis väljastavad midagi (nagu näiteks siinuse
funktsioon). Alljärgnev alamprogramm oleks Pascalis protseduur ja Visual
Basicus sub.
Alamprogrammid saab päises eraldi välja tuua ning
sellisel juhul saab neid lehe seest välja kutsuda. Siin näites on päises
funktsioon ehk alamprogramm looYlesanne, mis oma tegevuse tulemusena kirjutab
lehele ühe ühekohaliste liidetavatega liitmisülesande.
<html><head><title>Liitmine</title>
<script>
function looYlesanne(){
document.writeln(Math.round(10*Math.random())+"+"+
Math.round(10*Math.random())+"=<br>\n"
);
}
</script>
</head>
<body>
<script>
for(i=0; i<20; i++){
looYlesanne();
}
</script>
</body></html>
Teoreetiliselt on lubatud alamprogramme ka lehe sees
kirjeldada, kuid sel juhul pole kindel, kas tarvitamise ajaks see juba mällu
laetud on.
Alamprogrammile võib ette anda parameetreid, neid
saab funktsioon oma töös kasutada. Funktrsioon liida ootab kahte parameetrit
ning väljastab nende summa.
function
liida(a, b){
return a+b;
}
Selliselt loodud funktsiooni võib kasutada nii nagu
muidki.
document.writeln(liida(3,
2));
Javaskriptis pole funktsiooni parameetrite arv ega
tüübid määratud. Lihtsalt välja kutsudes tuleb arvestada, et etteantud
parameetrid sobiksid. Muul juhul saame soovimatu tulemuse või veateate. Lisaks
funktsiooni päises olevatele muutujate nimedele saame edastatud parameetreid
lugeda ka massiivist nimega arguments. Esimene võimalus on lihtsalt veidi
inimlikum. Kui aga parameetrite arv pole teada, siis tuleb neid paratamatult
massiivist lugeda. Järgnevas näites funktsioon seo ühendab parameetritena antud
väärtused üheks pikaks sõneks, pannes üksikute osade vahele eraldaja. Eraldajat
oodatakse funktsiooni esimese argumendina, ühendatavad sõnad riburadapidi tema
järel. Nii näiteks käsk
rida=seo(",
", "üks", "kaks","kolm");
peaks andma muutuja rida
väärtuseks "üks, kaks, kolm".
Argumentide massiiv arguments algab nullist nagu iga
muugi massiiv Javaskriptis (ja Javas ja C-s); arguments.length näitab
argumentide arvu. See massiiv dubleerib päisesse antud parameetreid. Tema kaudu
saab teada, palju tegelikult parameetreid edastati. Samuti saab sealtkaudu
kätte ka need väärtused, mille jaoks parameetreid ei jätku. Kuna massiiv
arguments dubleerib päisesse antavaid parameetreid, siis põhimõtteliselt võiks
funktsiooni sees kasutada muutuja "eraldaja" asemel arguments[0],
kuid praegune variant peaks siiski loetavam olema.
<html><head><title>Muutuvate parameetrite arvuga
funktsioon</title>
<script>
function seo(eraldaja) {
tulemus=arguments[1];
for (var i=2;
i<arguments.length; i++) {
tulemus += eraldaja +
arguments[i];
}
return tulemus;
}
</script>
<body>
<script>
document.writeln(seo(" - ", "ema", "isa",
"laps"));
</script>
</body></html>
Kümnekonna
sõnetöötluseks loodud käsuga õnnestub pea kõik tekstidega läbi viidavad
operatsioonid läbi viia. Javaskripti valdkonnast tulenevalt tuleb enamasti
kontrollida kasutaja sisestatud andmete õigsust, samuti töödelda andmeid ning anda nendest kokkuvõte või
süntees välja. Tähtsamad sõnetöötlusfunktsioonid on näha järgnevas näites.
<html><head><title>Sõne töötlemise
vahendeid</title></head>
<body>
<script>
lause="Juku tuli koolist";
document.writeln("Lause on: "+lause+"<br>");
document.writeln("Lause pikkus on "+ lause.length + "
tähte<br>");
document.writeln("Lause algab tähega
"+lause.charAt(0)+"<br>");
document.writeln("Sõna kool hakkab tähest nr
"+lause.indexOf("kool")+"<br>");
document.writeln("Tähed 5-9 moodustavad kokku sõna
"+lause.substring(5, 9));
</script>
</body></html>
Omadus length näitab pikkust (tähtede arvu), sel pole sulge taga, kuna on tegemist muutuja, mitte alamprogrammiga. Käsklus charAt võimaldab küsida soovitud kohal paikneva tähe. Tähti hakatakse lugema alates nullist. Pea sarnaselt saab sõnest tükki eraldada käsuga substring. Seal tuleb määrata nii koht, kust lugemisega alata kui tähe number, mille eest lõpetada. Kui lauset vaadata kui tähtede linti, siis andmete väljavõtmiseks sealt lõigatakse see nagu vasakult poolt välja. Nii, et kui soovin lausest kahte esimest tähte, siis tuleb kirjutada lause.substring(0, 2). Tähed number 0 ja 1 on sisse arvatud, 2 välja arvatud.
Alamsõnet otsitakse käsuga indexOf. Tulemusena väljastatakse number, mis näitab mitmendast tähest alates lauses algab parameetrina etteantud sõne. Juhul, kui vastavat tähekombinatsiooni ei leita, väljastatakse –1. Nii saab ka kontrollida, kas leidub lauses otsitud tähte/sõna või mitte. Otsitav sõne võib olla ka vaid ühe tähe pikkune, sel juhul lihtsalt saab teada, kas vastavat tähte lauses leidub. Lisaks võib käsule anda parameetri, mitmendast tähest alates üldse otsima hakatakse. Muul juhul juhtub, et saame teada vaid otsitava lõigu esimese asukoha lauses. Kui kirjutame aga "maletaja".indexOf("a", 3), peaksime vastuseks saama 5, sest tähest 3 ("e") alates järgmine a tuleb kohal 5.
Edasised ettevõtmised õnnestub teha juba tuntud käskude abil. Näiteks kui on vaja teada, kas sisestatud lauses leidub vähemalt kolm numbrit, siis peaksime algul ühes sõnes kirjeldama, millised tähed on numbrid. Edaspidi võib uuritavast lausest ükshaaval tähti välja võtta, kontrollida, millised neist leiduvad numbrite sõnes ning lugeda arv kokku. Kui oleks vaja stringe numbriteks muundada, siis selleks aitavad meetodid eval, parseInt ning parseFloat.