1. Főbb tulajdonságok:
Interpretálás: a forrássorokat a böngésző értelmezi és hajtja végre, lépésről lépésre.
Tehermentesíti a kiszolgálót és a közbülső hálózatot. (Űrlapok kitöltésekor a kliens ellenőrzi az adatok helyességét)
Interaktivitás (input mezők, egérműveletek)
Biztonság: a JavaScriptben nincs semmilyen utasítás vagy függvény, amivel elérhetővé válnának a kliens fájljai a kiszolgáló számára.
2. JavaScript alapok
Beillesztése a HTML forrásba:
A <SCRIPT> jelölő segítségével
<SCRIPT language = "JavaScript">
...
</SCRIPT>
Eseménykezelőként, más HTML jelölők paramétereként (ld. később)
Megjegyzés: /* ..... */ vagy // (a sor hátralévő része).
Kis- és nagybetűk különbözőek.
Objektum alapú nyelv. Egy objektum részei: elemváltozók (tulajdonságok) és elemfüggvények (metódusok).
Saját változók használata, típusok:
var kor = 21; // egész
var kamatláb = 10.5 // lebegőpontos (valós)
var lakhely = "Nyíregyháza"; // vagy 'Nyíregyháza', string
var hazas = false; // logikai (boolean), false/true
A var elhagyható, de használata ajánlott (egy függvény belsejében lokális változót csak így definiálhatunk).
Az utasítások végén pontosvessző. (Elhagyható, ha külön sorban vannak az utasítások.)
A JavaScript gyengén típusos nyelv: automatikus konverziók.
var a = 5;
var b = '6';
var c = '7';
a + b értéke 11, b + c értéke '67', b * c értéke 42 lesz.
2_1. Példa: Képcsere 1. Ha az egeret a kép fölé visszük, az megváltozik. Megoldás
2_1. Feladat: Képcsere 2. Amelyik kis kép fölé visszük az egeret, az jelenik meg nagyban.
3. Operátorok, kifejezések
Aritmetikai:
*, /, % (az osztás maradékát adja vissza: 5 % 3 értéke 2, 5.5 % 3 értéke 2.5) , +, -
Logikai:
! (negálás, egy operandusú), && (és), || (vagy)
Összehasonlító:
== (egyenlő), != (nem egyenlő), <, >, <=, >=
Léptető (egy operandusú operátorok):
++, --
++a; //növeli a értékét eggyel, értéke a+1
a++; //növeli a értékét eggyel, értéke a
3_1. Példa: forrás, futtatás (A források sok hasznos és új információt tartalmaznak!)
Bitenkénti:
~ (negálás, egy operandusú), & (és), | (vagy), ^ (kizáró vagy), << (balra léptetés pl: a << 2), >> (jobbra léptetés az előjel megtartásával), >>> (jobbra léptetés, az előjelet nem veszi figyelembe) (ld. 3. Példa)
Értékadó:
=,
+=, -=, *=, /= stb. Összetett értékadások, bármely kétoperandusú aritmetikai, bitenkénti műveletre.
Értelmezése: a += b egyenértékű: a = a + b
3_2. Példa: Számológép1 forrás, futtatás
3_3. Példa: Számológép2 futtatás
3_1. Feladat: Jelenjen meg három nyomógomb a weblapon piros, kék ill. fehér felirattal. Amelyikre kattintunk, olyan színű legyen a háttér.
Segítség: a háttérszín elérése: document.bgColor.
3_2. Feladat:Készítsünk valuta váltó programot!
Feltételes kifejezés
feltétel ? kifejezés1: kifejezés2 értéke: kifejezés1, ha a feltétel igaz, kifejezés2, ha a feltétel hamis.
Pl.: c = a > b ? a: b; c értéke a és b közül a nagyobbik lesz
3_4. Példa: Párosság forrás, futtatás
3_3. Feladat: Két számról döntsük el, hogy a második osztója-e az elsőnek! forrás, futtatás
4. Utasítások
4.1 Utasítás blokk, összetett utasítás
Kapcsos zárójelek között bármennyi utasítás. Mindenütt állhat, ahol egy utasítás állhat. (Pl. ciklusok, szelekciók belsejében.)
4.2 for ciklus
Szintaktikája:
for(inicializáló kifejezés;feltétel;léptető kifejezés)
utasítás
Az inicializáló kifejezés egyszer, amikor a ciklusra kerül a vezérlés, hajtódik végre. A ciklus addig ismétli az utasítás vére hajtását, amíg a feltétel (logikai kifejezés) igaz. Az utasítás után mindig végrehajtja a léptető kifejezést. Az inicializáló kifejezés több részből is állhat, vesszővel elválasztva. A ciklusfej bármely része elhagyható. Az utasítás lehet blokk is.
4_1. Példa: Összegzés futtatás
4_2. Példa: Csillagok futtatás
Feladatok:
4_1. N! kiszámítása
4_2. Írjunk ki csillagokat háromszög alakban!
4_3. Állítsuk elő a szorzótáblát ciklusok segítségével!
4.3 while utasítás
Szintaktikája:
while (feltétel)
utasítás
Addig ismétli az utasítást, amíg a feltétel (logikai kifejezés) igaz. Az utasítás lehet blokk is.
4_3. Példa: Írjuk ki, hogy a 10%-os kamatra elhelyezett pénzünk hány év alatt éri el az egymillió Ft-ot! futtatás
4.4 do while utasítás
Szintaktikája:
do{
utasítások
}while(feltétel)
Hátul tesztelő ciklus. Addig ismétli az utasítást, amíg a feltétel (logikai kifejezés) igaz.
4_4. Példa: Írjuk ki, hogy a 10%-os kamatra elhelyezett pénzünk hány év alatt éri el az egymillió Ft-ot! futtatás
4.5 Az if... else... utasítás
Szintaktikája:
if (feltétel)
utasítás1
else
utasítás2
Ha a feltétel (logikai kifejezés) igaz, akkor akkor az utasítás1 kerül végrehajtásra, majd az if szerkezet utáni utasításokkal folytatódik a program. Ha a feltétel hamis, akkor az utasítás2 kerül végrehajtásra. Az else ág elhagyható. Mindkét utasítás lehet összetett utasítás is.
4_5. Példa: Üdvözöljük a napszaknak megfelelően a felhasználót! futtatás
Feladatok:
4_4. Az üdvözlés négy féle legyen: Jó reggelt!, Jó napot!, Jó estét!, ill. Jó éjszakát!
4_5. Írjunk JavaScript függvényt, amely kiértékeli a következő űrlapot!
4.6 A switch utasítás
Többágú szelekciót tesz lehetővé. Szintaktikája:
switch (kifejezés)
{
case érték1:
utasítások
break
case érték2:
utasítások
break
...
default:
utasítások
}
A kifejezés kiértékelése után az értelmező azon a case ágon folytatja a futtatást, ahol az érték megegyezik a kifejezés értékével. Ha ilyen ág nincs, akkor a default ágra kerül a vezérlés. A default ág elhagyható. A break utasítással érhetjük el azt, hogy a megfelelő ág végrehajtása után a vezérlés a switch utáni első utasításra kerüljön.
4_6. Példa: Írjuk ki, hogy milyen nyelvű böngészőt használunk! forrás, futtatás
5. Egyszerű párbeszédablakok
Az alert, a confirm, valamint a prompt az előre definiált window objektum elemfüggvényei. A window objektum az aktuális ablakot reprezentálja, ez az alapértelmezés, nem szükséges kiírnunk a nevét (pl. window.alert...).
alert: A felhasználót tájékoztathatjuk egy üzenettel. Szintaktikája: alert(üzenet). Az argumentumként kapott stringet (üzenet) egy OK gomb társaságában kiírja egy kis párbeszédablakba.
confirm: A felhasználó igaz/hamis döntést hozhat. Szintaktikája: confirm(üzenet). Az argumentumként kapott stringet (üzenet) egy OK és egy Cancel gomb társaságában kiírja egy kis párbeszédablakba. A függvény true értékkel tér vissza, ha az OK, és false értékkel, ha a Cancel gombot nyomtuk meg.
prompt: Egy szövegbeviteli mezőt nyúj. Szintaxisa: változó = prompt(kiírandó, alapérték). Megjeleníti a kiírandó stringet, valamint egy szövegbeviteli mezőt benne az alapértékkel (string), amit felülírhatunk. Visszatérési értéke a beírt szöveg (, ha az OK-ra kattintottunk).
5_1. Példa: futtatás
5_1. Feladat: Egy gombra kattintva jelenjen meg egy dialógusablak, melyben angolul megadhatjuk az oldal kívánt háttérszínét! (A document objektum bgColor elemváltozójának kell értéket adnunk.)
6. Időzítés
A setTimeout függvény időzített programvégrehajtásra szolgál. Szintaxisa: setTimeout("kifejezés", msec). Egy időzítés indul el, és az msec-ben megadott milliszekundum múlva a kifejezés (ami általában JavaScript utasítás, vagy függvény) végrahajtódik.
6_1. Példa: Egy link automatikus aktivizálódása (letöltése) egy megadott időintervallum letelte után. futtatás
6_2. Példa: Egy oldal automatikus frissítése. futtatás
6_3. Példa: Egy szöveg futtatása a státuszsorban. futtatás
6_1. Feladat: Digitális óra megjelenítése. Használjuk a dátum objektum getHours(), getMinutes() és getSeconds() függvényeit!
7. Űrlap ellenőrzése elküldés előtt
Az űrlapokat általában elküldjük egy a szerveren lévő programnak, amely feldolgozza a benne szereplő adatokat. Ha az űrlapot hibásan töltöttük ki, akkor feleslegesen terheljük mind a hálózatot, mind a szerver oldali programot. Egy JavaScript programmal a kliens oldalon el lehet végezni a kitöltött mezők ellenőrzését (a JavaScript programot a böngésző futtatja), és így csak a hibátlan űrlapot küldjük el a szervernek.
Az alábbi példa négy különböző mező ellenőrzését végzi el. Ehhez használjuk a stringek kezelését megvalósító string objektum elemváltozóit, elemfüggvényeit:
string objektum:
Elemváltozó:
length a string hosszát tartalmazza.
Elemfüggvények:
charAt(index) az index-edik pozícióban lévő karakterrel tér vissza. (A karakterek sorszámozása 0-va kezdődik!)
indexOf(minta) a minta-t keresi, visszatérési értéke a megtalált pozíció, ill. ha nem talál: -1.
substring(index1, index2) egy részlánccal tér vissza az index1-től az index2 előtti karakterrel bezárólag.
toLowerCase() kisbetűssé konvertálja a stringet.
toUpperCase() nagybetűssé konvertálja a stringet.
A JavaScript
Mi a JavaScript?
A JavaScriptet a Netscape fejlesztette ki. Ez egy olyan parancsnyelv, amely segítségével létrehozhatunk interaktív Web-oldalakat. A cikk során számos klasszikus példával megismerkedhet az olvasó, ezeket könnyedén beépítheti a saját oldalaiba, vagy továbbfejlesztheti õket saját igényeinek megfelelõen. Az Internetrõl is letölthetõ sok egyszerû és kevésbé egyszerû példa. Tanácsos ezek forrását is áttanulmányozni, hiszen jó ötletek leshetõk el belõlük.
A JavaScript nem Java!
Mielõtt mélyebben belekezdenénk a JavaScript tanulmányozásába, érdemes egy fontos különbségre felhívni a figyelmet. A JavaScript nem tévesztendõ össze a Java-val! A hasonló név ellenére a Java önálló programozási nyelv, szükség van fordító programra, amivel a forráslistából bájtkódot készíthetünk. A JavaScript pedig parancsnyelv, futtatásához nem kell más, mint egy böngészõ, amely kezelni képes a JavaScriptet.
Hasonlóság azonban nem csak a névben van, ugyanis a két nyelv szintaxisa a C nyelvhez hasonlatos, a manapság divatos objektumorientáltságot pedig egyikük sem kerülhette el.
JavaScript futtatása
Mint korábban említettem, csak egy JavaScriptet "értõ" böngészõre van szükségünk. Ez lehet akár a Netscape Navigator, amely a 2.0-as verzió óta ismeri a JavaScriptet, vagy a Microsoft Internet Explorer (3.0 vagy nagyobb verzió). Mivel ezek a böngészõk a legelterjedtebbek, így a legtöbb ember képes JavaScriptet futtatni.
Ha az olvasó nem ismerné a HTML alapjait, érdemes most utána olvasni az Interneten található leírásokban, vagy az errõl szóló szaklapokban, mielôtt tovább olvasná a leírást.
JavaScript beágyazása HTML dokumentumba
A JavaScript utasítások közvetlenül a HTML oldalba kerülnek be. Lássunk erre egy egyszerû példát:
<HTML>
<BODY>
Ez itt egy hagyományos HTML dokumentum.<BR>
<SCRIPT LANGUAGE="JavaScript">
document.write("Ez már JavaScriptben íródott!!!<BR>")
</SCRIPT>
Ez a sor újra HTML!<BR>
</BODY>
</HTML>
Ha a böngészõnk értelmezni tudja a JavaScriptet, akkor ez a pár sor a következõt eredményezi:
Ez itt egy hagyományos HTML dokumentum.
Ez már JavaScriptben íródott!!!
Ez a sor újra HTML.
A három sor közül az elsõ és utolsó HTML-ben íródott, míg a középsõt a JavaScript document.write() parancsával írattuk ki. Látható, hogy a HTML <SCRIPT> elemét használtuk arra, hogy JavaScript utasításokat ágyazzunk a HTML dokumentumunkba. Minden, amit a <SCRIPT> és a </SCRIPT> elemek közé teszünk JavaScript utasításokként értékelõdnek ki. A LANGUAGE attribútum segítségével a JavaScript verziószámát határozhatjuk meg. A lehetséges verziók:
<SCRIPT LANGUAGE="JavaScript"> 1.0-ás JavaScript-et támogató böngészõkhöz
(pl. Netscape 2.0)
<SCRIPT LANGUAGE="JavaScript1.1"> 1.1-es JavaScript-et támogató bôngészõkhöz
(pl. Netscape 3.0)
<SCRIPT LANGUAGE="JavaScript1.2"> 1.2-es JavaScript-et támogató bôngészõkhöz
(pl. Netscape 4.0)
Ez azt jelenti, hogy például a Netscape 2.0 a JavaScript1.1, a Netscape 3.0 a JavaScript1.2 verziójú kódot figyelmen kívül hagyja.
Mi történik akkor, ha a böngészõnk régebbi, JavaScriptet nem ismerõ típus? Mivel a böngészõ nem ismeri a <SCRIPT> elemet, ezért azt nem veszi figyelembe, és a közötte lévõ utasításokat szövegként jeleníti meg a HTML dokumentumon belül. Természetesen van megoldás ennek elkerülésére. Amint az ismert, a HTML dokumentumokba megjegyzéseket az alábbi módon tehetünk:
<!-- A megjegyzés eleje
....................................
A megjegyzés vége -->
Javítsuk ki az elõbbi egyszerû példát az alábbi módon:
<HTML>
<BODY>
Ez itt egy hagyományos HTML dokumentum.<BR>
<SCRIPT LANGUAGE="JavaScript">
<!-- A JavaScript kód elrejtése, amennyiben szükséges
document.write("Ez már JavaScriptben íródott!!!<BR>")
// A kód elrejtésének vége -->
</SCRIPT>
Ez a sor újra HTML!<BR>
</BODY>
</HTML>
A JavaScript utasításokat HTML megjegyzések közé tesszük, így a nyelvet nem ismerõ böngészõk nem jelenítik meg az utasításokat, ugyanis azt megjegyzésként értelmezik. A JavaScriptet nem ismerõ böngészõ ezt a kódot az alábbi módon jelenítené meg:
Ez itt egy hagyományos HTML dokumentum.
Ez a sor újra HTML.
Ellenkezõ esetben igen zavaros sorokat kaphatunk:
Ez itt egy hagyományos HTML dokumentum.
document.write("Ez már JavaScriptben íródott!!!<BR>")
Ez a sor újra HTML.
Fontos viszont megemlíteni, hogy a JavaScript nem védhetõ meg a "kíváncsiskodó szemek" elöl, hiszen a HTML dokumentumok forrása megtekinthetõ a legtöbb böngészõ segítségével, a JavaScript utasítások pedig ennek közvetlen részét képezik.
Események
A programoknak gyakran kell reagálnia olyan eseményekre, mint billentyû lenyomása, vagy az egér mozgatása. Az események és eseménykezelõk a JavaScript programozásban is nagyon fontosak. Az ilyen események kezeléséhez különféle függvények, eseménykezelõk léteznek.
Tekintsük a következõ példát. Azt akarjuk, hogy a JavaScript programunk reagáljon valamilyen eseményre, pontosabban létrehozunk egy gombot, amire kattintva egy ablak jelenik meg a képernyõn. Ez gyakorlatilag azt jelenti, hogy az ablaknak egy kattintás-esemény (click-event) hatására kellene megjelenni. Az itt használt eseménykezelõ neve: onClick.
<form>
<input type="button" value="Kattints rám!" onClick="alert('Hello!')">
</form>
Ebben a példában létrehoztunk egy ûrlapot, amely egyetlen gombból áll. Ennek így még semmi köze nincs a JavaScripthez, hiszen ezt HTML-ben írtuk meg. Az újdonság az onClick="alert('Hello!')" rész, ami az <INPUT> HTML elem belsejében található, és ez már valóban JavaScript (vegyük azt is észre, hogy itt nem használtuk a <SCRIPT> HTML elemet!). Ez mondja meg, hogy mi történjen akkor, ha a felhasználó megnyomja a gombot. Ha ez bekövetkezik, akkor valójában egy onClick esemény generálódik, és ez végrehajtja az alert('Hello!') JavaScript kódot. Ez egy függvény, amely létrehoz egy üzenetablakot, melyben a zárójelen belül idézõjelek közé írt szöveget jeleníti meg.
Figyeljük meg azt is, hogy lehet idézõjelen belül idézõjelet használni! JavaScriptben mindkét idézõjelet lehet használni, csak arra kell ügyelni, hogy ez a számítógép számára is egyértelmû legyen. Az alábbi idézõjelhasználat is helyes lett volna:
onClick='alert("Hello!")'
Általánosan így írható le az eseménykezelés szintaxisa:
<HTML_elem eseménykezelõ_neve="JavaScript_utasítás">
Még sok más eseménykezelõ létezik. Ezek közül néhánnyal még találkozunk a cikk során, de addig is a következõ táblázat összefoglalja a fontosabb eseményeket:
Események Mire alkalmazható? Mikor következik be? Az eseménykezelõ neve
abort
képek A felhasználó megszakítja a kép betöltését
onAbort
blur ablak, keret, és minden ûrlapmezõ Az egérrel az aktuális mezõn kívülre kattintunk
onBlur
change szövegmezõ, listaablak Megváltoztatunk egy ûrlap beli értéket
onChange
click gombok, rádió gomb, csatolások (linkek) Az ûrlap valamely elemére, vagy egy csatolásra (link) kattintunk
onClick
error
ablak, képek Ha kép vagy dokumentum betöltésekor hiba lép fel
onError
focus ablak, keret, minden ûrlapmezõ Kijelöljük az ûrlap egy elemét
onFocus
load dokumentum törzse (BODY) A böngészõ új lapot tölt be
onLoad
mouseout
linkek Az egérmutató elhagyja a linket
onMouseOut
mouseover linkek Az egérmutató valamely link felett tartózkodik
onMouseOver
reset
ûrlapokra Ûrlap törlésekor
onReset
select szövegmezõ Új mezõt jelölünk ki
onSelect
submit submit típusú nyomógomb Ûrlap elküldésekor
onSubmit
unload dokumentum törzse (BODY) Ha másik HTML oldalra lépünk
onLoad
Függvények
Minden programozási nyelvben, így a JavaScript-ben is rendkívül fontos szerepet kapnak a függvények. A nyelv számos függvényt tartalmaz, például a korábban megismert alert() függvény is ezek közül való. A függvényeknek adhatunk át paramétereket, amelyekkel dolgozni fognak (az alert() függvény paramétere az idézõjelek között átadott szöveg volt, amit a függvény egy üzenetablakban jelenített meg). Mi magunk is írhatunk függvényeket, hogy a nagyobb, összetettebb feladatokat kisebb, jobban kezelhetõbb részekre bontsuk. Ezek a függvények szintén átvehetnek paramétereket, sõt értéket is adhatnak vissza, csakúgy, mint más progamozási nyelvekben. A függvények mûködését egy rövid példán keresztül mutatom be:
<HTML>
<SCRIPT LANGUAGE="JavaScript">
<!-- A JavaScript kód elrejtése, amennyiben szükséges
function szamol_1(x,y){
var eredmeny = x + y;
document.write("<H2>" + x + " + " + y + " =
" + eredmeny + "</H2><BR>");
}
function szamol_2(x,y){
return x+y;
}
szamol_1(23,11);
szamol_1(17,27);
szamol_1(3,45);
document.write("<H2>13 + 5 = " + szamol_2(13,5) + "<H2>");
//-->
</SCRIPT>
</HTML>
A program eredménye a következô lesz:
23 + 11 = 34
17 + 27 = 44
3 + 45 = 48
13 + 5 = 18
Ebben a rövid programban két függvényt hoztunk létre szamol_1 és szamol_2 néven. Figyeljünk arra, hogy a JavaScript a kis- és nagybetûk között különbséget tesz, így például a JAVASCRIPT, javascript, JavaScript három különbözõ függvénynévnek bizonyulna.
A JavaScript-ben írt függvények elé kötelezôen be kell írni a function kulcsszót, viszont ellentétben pl. a C++ vagy a Java függvényeivel nem kell a visszatérési értéknek, valamint a paramétereknek a típusát megadni.
Nézzük most meg részletesen a szamol_1 nevû függvényt, hogyan épül fel, és hogy mûködik!
function szamol_1(x,y){
var eredmeny = x + y;
document.write("<H2>" + x + " + " + y + " = " + eredmeny + "</H2><BR>");
}
A function kulcsszót közvetlenül a függvény neve követi, majd zárójelekben a paramétereket adjuk meg. Ez a függvény két paraméterrel rendelkezik, x-szel és y-nal (amelyek típusát nem adtuk meg). A függvény törzse kapcsos zárójelek között van, és ide helyezzük el a függvényhez tartozó utasításokat.
A függvényben három változót is használunk (x, y és eredmeny). A JavaScript programok változókban tárolják az információkat, adatokat. A példánál maradva x illetve y tárolja el az összeadandó számok értékeit, és az eredmeny nevû változó tárolja el az összeget.
Eltérôen más programozási nyelvektôl, a JavaScript-ben nem kell definiálnunk a változók típusát (mint pl. int, float, char stb.), hanem azt a programot végrehajtó böngészô állapítja meg a változók használata alapján.
JavaScript-ben a változók neve betûvel, vagy aláhúzással (_) kezdôdhet, és a függvénynevekhez hasonlóan szintén különbség van kis- és nagybetûk között.
Változót a var kulcsszóval, majd a változó nevének megadásával deklarálhatunk. Deklaráláskor az értékadó operátor (=) segítségével kezdôértéket is rendelhetünk a változókhoz. Ezt tettük a példánkban is:
var eredmeny = x + y;
Azaz létrehoztuk az eredmeny nevû változót, és kezdôértéknek a paraméterként átadott x és y változók összegét adtuk. A függvény törzsének második sora elvégzi a számolás eredményének kiírását. A document.write utasítást használtuk itt fel, amivel már találkoztunk. Az egyetlen érdekesség az argumentumban található, a zárójeleken belül, ugyanis a kiírandó szöveget részekbôl fûztük össze. A "<H2>" rész HTML-bôl ismerôs, a kiírás típusát határozza meg. Ehhez fûzzük hozzá az x változót. Mivel x nem idézôjelek között van, ezért nem egy x karakter, hanem az x változó értéke kerül kiírásra. És így tovább, elôször egy "+" karaktert, majd y változó értékét, egy "=" karaktert, ill. az eredmeny változó értékét fûzzük az eddigi karakterláncunkhoz, legvégül a "</H2>" HTML elemmel zárjuk le a karakterláncunkat a HTML szabályainak megfelelôen. Ha x értéke 23, y értéke 11, akkor az eredmeny változó értéke x és y összege, azaz 34 lesz, és a kiírandó karakterlánc a következônek felel meg:
"<H2> 23 + 11 = 34 </H2>"
A függvényeket a nevükkel hívjuk meg, és híváskor adjuk át a paraméterek aktuális értékét. Példánkban az elsô függvényt háromszor hívtuk meg:
szamol_1(23,11);
szamol_1(17,27);
szamol_1(3,45);
Látható, hogy a függvény nevét követi az ún. aktuális paraméter lista, ami az elsô esetben 23 és 11, azaz a függvényben szereplô x változó értéke 23, míg az y értéke 11 lesz. Az aktuális paraméterlistát ugyanúgy zárójelek közé tesszük, mint a függvények definíciójában szereplô formális paraméterlistát. A második esetben ez alapján x 17, y 27, a harmadik esetben x 3, y 45 értéket vesz fel.
A szamol_2 függvény egy lényeges dologban különbözik az elôbbitôl. Rendelkezik visszatérési értékkel.
function szamol_2(x,y){
return x+y;
}
Amint említettem, JavaScript-ben eltérôen más programozási nyelvektôl nem kell a visszatérési érték típusát megadni. A függvény x+y értéket adja vissza a return utasítás felhasználásával. Figyeljük meg a függvény hívását!
document.write("<H2>13 + 5 = " + szamol_2(13,5) + "</H2>");
A szamol_2 függvényt a 13 és 5 paraméterekkel hívtuk meg, amely kiszámolja azok összegét és visszatér ezzel az értékkel. Ez az érték behelyettesítôdik a hívás helyére, így a document.write függvény argumentuma gyakorlatilag a következô lesz:
"<H2>13 + 5 = 18 </H2>"
A HTML dokumentum
A JavaScript felépítése
A JavaScript egy HTML oldal minden elemét, és a böngészô ablakát is objektumként kezeli. Minden ilyen objektum rendelkezik tulajdonságokkal (adatmezõkkel) és megfelelô függvényekkel, amelyeken keresztül az oldal szinte minden tulajdonságát megváltoztathatjuk, a böngészô egyes részeit programozhatjuk. A böngészô ablaka a JavaScript szemszögébôl egy ún. window objektum (window-object). Ez bizonyos elemeket tartalmaz, mint például a státuszsort. Az ablak belsejébe HTML oldalt tölthetünk, amit a JavaScript a document objektumon keresztül kezel. A document objektum az aktuálisan betöltött oldalt kezeli, és ezáltal egyike a leggyakrabban használt és legfontosabb objektumoknak. Segítségével módosíthatjuk az oldalunk megjelenését, például beállíthatjuk a színeket! Próbáljuk ki az alábbi példát!
Nézzük meg a kódot!
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!-- A kód elrejtése, ha szükséges
function sarga(){
document.bgColor="#FFFF00";
}
function kek(){
document.bgColor="#00FFFF";
}
function eredeti(){
document.bgColor="#FFFFFF";
}
// --> Elrejtés vége
</SCRIPT>
</HEAD>
<BODY>
<CENTER>
<P>
<FORM>
<INPUT TYPE="button" VALUE="Sárga háttér" onClick="sarga()">
<INPUT TYPE="button" VALUE="Kék háttér" onClick="kek()">
<INPUT TYPE="button" VALUE="Eredeti háttér" onClick="eredeti()">
</FORM>
</P>
</CENTER>
</BODY>
</HTML>
Létrehoztunk három függvényt sarga(), kek() és eredeti() néven. Mindegyik egyetlen értékadó utasítást tartalmaz, amellyel a document objektum bgColor nevû mezôjének adunk új értéket. Ebben az adatmezôben tárolódik ugyanis a háttérszín aktuális beállítása. Ha ezt felülírjuk valami más értékkel, akkor megváltozik a dokumentum háttérszíne is. Az új színt a HTML-bôl jól ismert RGB színkód formájában kell megadni. A gombokat egy ûrlappal állítottuk elô, és a Bevezetésben már bemutatott onClick esemény hatására hívódnak meg a megfelelô függvények.
Megváltoztathatók a HTML oldalunk egyéb színbeállításai is, ha a document objektum más adatmezôjének adunk az elôbbihez hasonló módon értéket. Egy táblázatban foglaljuk össze a színekkel kapcsolatos mezôket:
alinkColor Az aktív linkek színe
bgColor Háttérszín
fgColor Az elôtér színe
linkColor A linkek színe
vlinkColor Már meglátogatott linkek színe
Ezek ismeretében a linkek színét például a következô utasítással vátoztathatjuk meg:
document.linkColor = "#xxxxxx"
ahol xxxxxx helyére a kívánt RGB színkódot kell beírni.
Ennél sokkal fontosabb azonban, hogy a HTML objektumok is a document objektum mezôi. HTML objektumok például az oldalon megjelenô képek, linkek, ûrlapok. Mielôtt megnéznénk, hogy milyen módon kezelhetjük ezeket az objektumokat, hozzunk létre egy egyszerû HTML oldalt!
<HTML>
<HEAD><TITLE>Példa oldal</TITLE></HEAD>
<BODY BGCOLOR=#FFFFFF>
<CENTER>
<IMG SRC="pelda1.jpg" NAME="pelda_pic1">
<P>
<FORM NAME="pelda_urlap">
Név:
<INPUT TYPE="text" NAME="nev" VALUE="JavaScript"><BR><BR>
Cím:
<INPUT TYPE="text" NAME="cim" VALUE="www.netscape.com"><BR><BR>
<INPUT TYPE="button" VALUE="Kattints rám" NAME="gomb"
onClick="alert('Most megnyomtál! :-)')">
</FORM>
<P>
<P>
<IMG SRC="pelda2.jpg" NAME="pelda_pic2">
<P>
<P>
<A HREF="http://www.netscape.com">Nézd meg a Netscape JavaScript
oldalait is!</A>
</CENTER>
</BODY>
</HTML>
Ez a rövid HTML kód a következô dokumentumot eredményezi.
Hogyan hivatkozhatunk az oldal egyes elemeire? Ebben a példa HTML dokumentumban két kép, egy link és egy ûrlap található két szövegmezôvel valamint egy gombbal. A hivatkozás az egyes objektumok típusa szerint megy. Az oldalon elôforduló elsô képhez az images[0] névvel férhetünk hozzá, a másodikhoz az images[1] névvel és így tovább. A linkek a links[0], links[1], links[2]... néven szerepelnek. Az ûrlapokat forms[0], forms[1], forms[2]..., míg az ûrlapok egyes mezôit (pl. szövegmezô, listaablak, gombok) forms[X].elements[0], forms[X].elements[1], forms[X].elements[2]... névvel érhetjük el, ahol X valamely ûrlap sorszáma.
A példánál maradva nézzük meg sorrendben, hogy az oldalon található HTML objektumokra hogyan hivatkozhatunk (mivel a HTML objektumok a document objektum mezôi, ezért mindegyik hivatkozás ezzel kezdôdik):
az elsô képre:
document.images[0]
az ûrlap Név nevû szövegmezôjére:
document.forms[0].elements[0]
az ûrlap Cím nevû szövegmezôjére:
document.forms[0].elements[1]
az ûrlap gombjára:
document.forms[0].elements[2]
a második képre:
document.images[1]
a linkre:
document.links[0]
Azt, hogy egy hivatkozás révén milyen mûveleteket végezhetünk el az egyes HTML objektumokkal, különbözô JavaScript referencia könyvek tartalmazzák. Mi néhány alapvetô mûveletet nézünk csak meg. Hivatkozzunk az ûrlapunk elsô szövegmezôjére, olvassuk ki a tartalmát a nev nevû változóba! Ezt megtehetjük az alábbi utasítással (figyeljünk arra, hogy kis- és nagybetû itt is számít):
nev = documents.forms[0].elements[0].value;
A szövegmezô tartalma bekerült a változónkba, amivel továbbiakban különféle mûveleteket végezhetünk: pl. kiírathatjuk egy üzenetablakba az alert("Szia " + name) függvénnyel. Nézzük meg ezt mûködés közben, majd utána a kódot, amelyben már minden ismert!
Név:
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!-- Elrejtés
function Udvozol(){
var name = document.forms[0].elements[0].value;
alert("Szia "+name);
}
// -->
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="urlap"> Név: <INPUT TYPE="text" NAME="nev">
<INPUT TYPE="button" VALUE="Írd be a neved, majd kattints rám!"
onClick="Udvozol()">
</FORM>
</BODY>
</HTML>
Jogosan felmerülhet a kérdés, hogy nagyobb HTML dokumentumok esetén van-e egyszerûbb módszer a hivatkozásra, hiszen nem könnyû sok link, kép, ûrlapmezô esetén kiszámolni, hogy pontosan melyikkel szeretnénk dolgozni. Természetesen erre is van lehetôség, mégpedig úgy, hogy minden HTML objektumnak önálló, egyedi nevet adok. Ha az ûrlapunkat megnézzük, akkor látható, hogy ezt már meg is tettük az <INPUT> HTML elemen belül a NAME attribútum megadásával:
<FORM NAME="pelda_urlap">
Név:
<INPUT TYPE="text" NAME="nev" VALUE=""><BR>
Az ûrlapunknak a pelda_urlap nevet, az elsô szövegmezônek a nev nevet adtuk. Ez alapján, erre az objektumra document.forms[0].elements[0] helyett használhatjuk a document.pelda_urlap.nev hivatkozást is.
Új értéket is rendelhetünk bizonyos HTML objektumokhoz, például egy szövegmezôhöz:
És íme a kód: onClick esemény hatására új értéket rendelünk a az uj nevû ûrlap szoveg nevû mezôjéhez.
<FORM NAME="uj">
<INPUT TYPE="text" NAME="szoveg" VALUE="www.microsoft.com">
<INPUT TYPE="button" VALUE="Új szöveg"
onClick="document.uj.szoveg.value='www.yahoo.com';">
</FORM>
A location objektum
Ez az objektum reprezentálja a betöltött HTML dokumentum címét. Ha például betöltöttük a Netscape oldalát, akkor a location objektum href mezôje (location.href) ennek az oldalnak a címét fogja tárolni (www.netscape.com). Ehhez a mezôhöz új értéket rendelve új oldalt tölthetünk be a böngészôbe:
<FORM>
<INPUT TYPE="button VALUE="Altavista"
onClick="location.href='http://altavista.com';">
</FORM>
Javascript példák
Űrlap "küldése" javascriptben
<head>
<script type="text/javascript">
function send() {
var x = document.getElementById('posts');
var u = document.f1.user.value;
var v = document.f1.valami.value;
x.innerHTML += "<b>"+u+"</b>:"+v+"<br>";
}
</script>
</head>
<body>
<h1>Űrlap feldolgozása Javascriptben</h1>
<div style="padding:20px;border:solid 1px;width:500px;">
<form name="f1" action="javascript:send()">
Név:
<input type="text" name="user" size="30" maxlength="30"><br>
Mondj valamit:
<input type="text" name="valami" size="50" maxlength="50"><br>
<input type="submit" value="Mehet!">
</form>
</div>
<div id="posts"> </div>
</body> </html>
Űrlap ellenőrzése
<head>
<script type="text/javascript">
function send() {
var x = document.getElementById('posts');
var um = document.getElementById('umsg');
var vm = document.getElementById('vmsg');
var u = document.f1.user.value;
var v = document.f1.valami.value;
um.innerHTML = "";
vm.innerHTML = "";
if (u=="") {
um.innerHTML = "Nem maradhat üresen!";
} else
if (v=="") {
vm.innerHTML = "Nem maradhat üresen!";
} else {
x.innerHTML += "<b>"+u+"</b>:"+v+"<br>";
}
}
</script>
</head>
<body>
...
<form name="f1" action="javascript:send()">
<table>
<tr><td colspan="2"> <div id="umsg" style="height=20px;color:red;"> </div></td></tr>
<tr> <td>Név:</td> <td><input type="text" name="user" size="30" maxlength="30"></td></tr>
<tr><td colspan="2"><div id="vmsg" style="height=20px;color:red;"> </div></td></tr>
<tr> <td>Mondj valamit: </td> <td><input type="text" name="valami" size="50" maxlength="50"></td></tr>
<tr><td colspan="2"><input type="submit" value="Mehet!"></td></tr>
</table>
</form>
...
<div id="posts" style="padding:10px;"> </div>
...
</body>
Matematikai algoritmusok
Czövek Márton programja
3k+1 probléma
<script>
function send(){
var x = document.getElementById("Szoveg");
var i = document.f1.Bemenet.value;
x.innerHTML = i+" , ";
while( i != 1 ) {
if ( i%2 == 1) {
i= 3*i+1;
} else { i = i/2; }
x.innerHTML += i+" , ";
}
}
</script>
...
<p>
<strong style="font-size: 18px">Írj be egy számot:</strong>
</p>
<form name="f1" action="javascript:send()">
<input type="text" name="Bemenet" size="15" maxlength="15"> <br/>
<input type="submit" value="Küldés">
<p id="Szoveg"></p>
</form>
Eseménykezelők
Katona Dávid játéka:
<!DOCTYPE html>
<html>
<head>
<title>Game!</title>
<meta charset="utf-8">
<style>
#canvas {
display: block;
border: solid 1px;
margin-top: 50px;
margin-left: auto;
margin-right: auto;
}
</style>
</head>
<body>
<canvas id="canvas" width= "500" height= "500";></canvas>
<table align="center">
<tr><td><form action="javascript:move()">
<input type="submit" value="Start!" Onclick="">
</form></td>
<td><form>
<input type="submit" value="Restart!" onClick="href='labda.html'">
</form></td></tr>
<tr><td colspan="2">
<form>
<select id="Level">
<option value="Beginner" >Kezdő</option>
<option value="Medium" > Közepes</option>
<option value="Impossible" >Legyőzhetetlen</option>
<option value="Multi" >2 játékos</option></select>
</form></td></tr>
</table>
<script for=document event="onkeydown()" language="JScript">
if (window.event) KeyDown(window.event.keyCode);
</script>
<script language="JavaScript1.2">
if (navigator.appName != "Microsoft Internet Explorer")
document.captureEvents(Event.KEYDOWN)
document.onkeydown = NetscapeKeyDown;
function NetscapeKeyDown(key){
KeyDown(key.which);
}
</script>
<script>
function KeyDown(whichkey){
if (line.x<=0 && whichkey == 37){line.x=line.x;}
else{
if (line.x>=W-l && whichkey == 39){line.x=line.x;}
else{
if (whichkey == 37) {line.x-=linemove;}//Bal nyíl lenyomása esetén...
if (whichkey == 39) {line.x+=linemove;}//Jobb nyíl lenyomása esetén...
if (whichkey == 52) {line.x-=linemove;}//Bal nyíl a NumPad-on...
if (whichkey == 54) {line.x+=linemove;}//Jobb nyíl a NumPad-on...
}
}
if (lv=="Multi"){
if (enemy.x<=0 && whichkey == 65)
{enemy.x=enemy.x;}
else{
if (enemy.x>=W-l && whichkey == 68){enemy.x=enemy.x;}
else{
if (lv=="Multi")
{
if(whichkey == 65){enemy.x-=linemove;}
if(whichkey == 68){enemy.x+=linemove;}
}
}
}
}
}
var c=document.getElementById("canvas");
var beginner=0;
var medium=0;
var impossible=0;
var pm=1;
var ctx=c.getContext("2d");
var x=250, y= 250;
var frame = 1000/60;
var H=500, W=500;
var l=100;
var score=0;
var escore=0;
var linemove= l/5;
var enemy = {}
enemy = {
x : W/2-l/2,
y : 10,
vonal: function(){
ctx.beginPath();
ctx.moveTo(this.x,this.y);
if (lv=="Beginner"){ctx.lineTo(this.x+l,this.y);}
if (lv=="Medium"){ctx.lineTo(this.x+l,this.y);}
if (lv=="Impossible"){ctx.lineTo(this.x+l/2,this.y);}
if (lv=="Multi"){ctx.lineTo(this.x+l,this.y);}
ctx.stroke();
}
}
var ball = {}
ball = {
x : W/2,//labda indulási x koordinátája
y : H-15,//labda indulási y koordinátája
r : 4,//labda sugara
vx: 4.10,//labda vízsintes mozgásának összetevője
vy: 2.2,//labda függőleges mozgásának összetevője
ax: 0.000,//labda vízszintes gyorsulása
ay: 0.000,// labda függőleges gyorsulása
rajz: function(){//Ez a függvény rajzolja le a labdát.
ctx.beginPath();
ctx.arc(this.x,this.y,this.r,0,Math.PI*2);
ctx.stroke();
}
}
var line = {}//Ez az alsó vonal
line = {
x : W/2-l/2,
y : H-10,
vonal: function(){
ctx.beginPath();
ctx.moveTo(this.x,this.y);
ctx.lineTo(this.x+l,this.y);
ctx.stroke();
}
}
var anim;
var lv;
function move (){
lv=document.getElementById("Level").value;//lekérdezzük a szintet induláskor.
anim = setInterval(update,frame)
}
function update (){
ctx.clearRect(0,0,W,H);
ctx.font = "bold 20px Arial";
ctx.fillText(escore,5,200);
ctx.fillText(":",5,250);
ctx.fillText(score,5,300);
ball.rajz();
line.vonal();
enemy.vonal();
if (lv=="Beginner")
{if(pm==2){enemy.x=(ball.x+beginner/2-l/2);}
else{enemy.x=(ball.x-beginner/2-l/2);}}
if (lv=="Medium")
{if(pm==2){enemy.x=(ball.x+medium/2-l/2);}
else{enemy.x=(ball.x-medium/2-l/2);}}
if (lv=="Impossible")
{if(pm==2){enemy.x=(ball.x+impossible/2-l/4);}
else{enemy.x=(ball.x-impossible/2-l/4);}}
ball.x+=ball.vx;
ball.y+=ball.vy;
ball.vx +=ball.ax;
ball.vy +=ball.ay;
if (lv=="Beginner"){if (ball.y <=ball.r+enemy.y && ball.x>enemy.x && ball.x<enemy.x+l) {
ball.y=ball.r+enemy.y;
ball.vy=-ball.vy;
}
}//labda visszapattan
if (lv=="Medium"){if (ball.y <=ball.r+enemy.y && ball.x>enemy.x && ball.x<enemy.x+l) {
ball.y=ball.r+enemy.y;
ball.vy=-ball.vy;
}
}//labda visszapattan
if (lv=="Impossible")
{if (ball.y <=ball.r+enemy.y && ball.x>enemy.x && ball.x<enemy.x+l/2) {
ball.y=ball.r+enemy.y;
ball.vy=-ball.vy;
}
}//labda visszapattan
if (lv=="Multi"){if (ball.y <=ball.r+enemy.y && ball.x>enemy.x && ball.x<enemy.x+l) {
ball.y=ball.r+enemy.y;
ball.vy=-ball.vy;
}
}//labda visszapattan
if(ball.y <enemy.y){score+=1;ball.vy=-ball.vy;
if (score-escore==10){//10 pontkülönbségnél vége van!
ctx.fillText("Nyertel: "+score+" "+escore+"-re!", 195, 235);
ctx.fillText("Gratulalunk!", 210, 265);
clearInterval(anim);//megáll az animáció
}
}
if (ball.y >= -ball.r+line.y && ball.x>line.x && ball.x<line.x+l) {
ball.y=-ball.r+line.y;
ball.vy=-ball.vy;
pm=Math.floor(Math.random()*2)+1;
if(lv=="Beginner"){beginner=Math.floor(Math.random()*(l+l/3))+1;}
if(lv=="Medium"){medium=Math.floor(Math.random()*(l+l/5))+1;}
if(lv=="Impossible"){impossible=Math.floor(Math.random()*(l/4-1))+1;}
}
if (ball.y >line.y){
escore+=1;
pm=Math.floor(Math.random()*2)+1;
if(lv=="Beginner"){beginner=Math.floor(Math.random()*(l+l/3))+1;}
if(lv=="Medium"){medium=Math.floor(Math.random()*(l+l/5))+1;}
if(lv=="Impossible"){impossible=Math.floor(Math.random()*(l/4-1))+1;}
ball.vy=-ball.vy;
if (escore-score==10){//10 pontkülönbségnél vége van!
ctx.fillText("Vesztettel: "+score+" "+escore+"-re :S", 165, 235);
ctx.fillText("Probald ujra!", 205, 265);
clearInterval(anim);//megáll az animáció
}
}
if (ball.x <= ball.r) {// az oldalsó falról való visszapattanás.
ball.x=ball.r;
ball.vx=-ball.vx;
}
if (ball.x >= W-ball.r) {// az oldalsó falról való visszapattanás.
ball.x=W-ball.r;
ball.vx=-ball.vx;
}
}
</script>
</body>
</html>