online kép - Fájl  tubefájl feltöltés file feltöltés - adja hozzá a fájlokat onlinefedezze fel a legújabb online dokumentumokKapcsolat
  
 

Letöltheto dokumentumok, programok, törvények, tervezetek, javaslatok, egyéb hasznos információk, receptek - Fájl kiterjesztések - fajltube.com

Online dokumentumok - kep
  

JavaScript alapok

számítógépes



felso sarok

egyéb tételek

jobb felso sarok
 
Automatika Segédlet Elektronikus eszközök szak II: évfolyam Nappali Müszaki Manager szak II: évfolyam Nappali
Létezõ adatbazis vagy objektumablak bezarasa, illetve megnyitasa - ACCESS
A személyi szamítógépek felépítése (részegységek, jellemzöik). Processzorok jellemzöi, fajtai. Memória jellemzöi, típusai.
Grafikai alapfogalmak
Kezdetek ++
Egy kis elmélet
Csomag alapú halózatok alapjai
Network Monitor A halózati forgalom elemzése - 1. rész, elméleti alapok
A relaciós adatmodell, kulcsok
 
bal also sarok   jobb also sarok

JavaScript alapok


Mi is az a JavaScript?

A JavaScript egy objektum alapú programozási nyelv, melyet a Netscape fejlesztett ki eredetileg LiveScript néven. A LiveScript és a Java ötvözésébõl alakult ki a JavaScript, melyet elõször a Netscape Navigator 2.0-ban implementáltak. Sokan nevezik a nyelvet objektum orientáltnak, ami azonban nem teljesen igaz, hiszen olyan alapvetõ tulajdonságok, mint például az öröklõdés, hiányoznak belõle.
A JavaScript a Java appletektõl és a Java programoktól eltérõen futásidõben kerül értelmezésre. Tehát a böngészõ letölti az oldalt, megjeleníti a tartalmát, majd értelmezi a JavaScript (vagy más nyelven írt scriptek) sorait. Már most fontos leszögezni, hogy a JavaScript nem Java! Szintaktikájában és felépítésében ugyan nagyon hasonlít a nevét adó proramozási nyelvre, azonban le 848d39i hetõségei sokkal korlátozottabbak.

JavaScript és a böngészõk

Mivel a JavaScript interpretált nyelv, a programunk csak az oldal betöltésekor fog lefutni, addig a HTML kód sorai között pihen. Ennek a megoldásnak az az elõnye, hogy a hibás programsorokat könnyedén tudjuk javítani, hátránya viszont az, hogy a fáradtságos munkával megírt scriptünkhöz bárki hozzáférhet, aki megtekinti oldalunkat.
Ha egy programot a böngészõ futtat, annak vannak pozitív és negatív tulajdonságai is. Elõnyként értékelhetõ az, hogy a scriptünk platformfüggetlen lesz, tehát ugyanúgy fog futni egy Macintosh gép böngészõjében, mint a sokat dicsért Windows-os környezetben. Hátrányai közé sorolható viszont az, hogy a script hibátlan futtatása - a szabványok többféle értelmezésének köszönhetõen - erõsen a használt böngészõ típusának függvénye. Jelentõs eltérések fedezhetõk fel már csak Windows-os böngészõk JavaScript implementációinak összehasonlítása során is. Nézzünk csak meg egy Internet Explorer 5.0-ra optimalizált oldalt Netscape, vagy Opera böngészõkkel! Jó esetben csak néhány funkció nem mûködik az oldalon, máskor azonban az egész weblap mûködésképtelenné válhat.
További problémák merülhetnek fel, ha oldalunk látogatója olyan böngészõt használ, mely nem támogatja, vagy nem ismeri a JavaScriptet, bár ennek valószínûsége manapság igen kicsi. E böngészõk ugyanis hajlamosak arra, hogy a számukra értelmezhetetlen utasításokat egyszerûen megjelenítik, mintha az a weblap szövegének része lenne, elcsúfítva és feltárva ezzel gondosan elkészített oldalunkat. Hogy ezt elkerüljük az utasításainkat a HTML kód megjegyzései közé kell beillesztenünk: a "<!--" és "-->" szekvenciák közé. Az újabb böngészõket nem zavarja ez a kis csalafintaság, a HTML szabványt pontosan követõ régebbi változatok pedig nem zavarodnak össze tõle, mert egyszerûen kommentként értelmezik a valójában script-kódot tartalmazó oldalrészeket.
A fentiek miatt nagyon fontos, hogy szem elõtt tartsuk a következõ dolgokat: scripteket csak korlátozott mértékben alkalmazzunk, és lehetõleg úgy, hogy azt több böngészõ segítségével is kipróbáljuk. A másik dolog, hogy ha amennyiben lehetõség van rá, alkalmazzunk statikus HTML megoldásokat a feladatok ellátására és szerver-oldali ellenõrzéseket a bemenõ adatok validálására arra az esetre, ha a JavaScript kódunk ezt a feladatot a böngészõ vezriója és/vagy beállításai miatt nem képes elvégezni. Hogy egy kicsit érthetõbb legyen: ha script segítségével automatikusan átirányítunk egy oldalt egy másikra (késõbb leírjuk hogyan), akkor tegyünk az oldalra egy linket is, amelyik a másik oldalra vezet, azon böngészõk számára, akik nem értik a JavaScriptet. A problémák egy része ugyan a böngészõ azonosításával (szintén késõbb) elkerülhetõ, azonban jobb a scriptek használatával csínján bánni.

JavaScript beágyazása a HTML dokumentumba

Miután megismertük a nyelv történetét és sajátosságait, lássuk az elsõ programot, melynek feladata mindössze annyi lesz, hogy egy kis felbukkanó üzenetablakban megjeleníti a "Hello World!" szöveget.

<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
 alert("Hello World!");
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>

A példa egyszerû, de ugyanakkor nagyon szemléletes (remélhetõleg). A HTML dokumentumunk fejrészébe illesztettünk be egy programsort a <SCRIPT> tagok közé, így a böngészõvel tudattuk, hogy a HTML kódot más nyelven írt scripttel szakítjuk meg. Mivel többféle scriptnyelv is létezik (pl.: VBScript), és ezek közül többet is használhatunk egy dokumentumon belül, a böngészõnek megmondhatjuk, hogy mely scripteket hogyan kell értelmeznie. Ehhez a SCRIPT tag LANGUAGE attribútumát kell beállítanunk. Ha például egyszerûen a JavaScript szót írjuk ide be, az a böngészõ számára a JavaScript 1.0-s verzióját jelenti. Ha olyan szolgáltatásokat is használni szeretnénk, melyek ebben a verzióban még nem szerepelnek, az attribútumnak adjuk értékül a JavaScript1.2-t, és máris új funkciókkal bõvülnek scriptünk lehetõségei.
Térjünk vissza egy pillanatra a programhoz, mely tulajdonképpen egyetlen sorból áll, mely elvégzi a kitûzött feladatot, azaz megjeleníti üzenetünket. Ehhez az ALERT() metódust (ha jobban tetszik függvényt, de legyünk objektum alapúak), használtuk. Az alert eljárás használata rendkívül egyszerû a zárójelek között kell megadnunk a megjelenítendõ szöveget. Ha szövegünk statikus, azaz nem változik, idézõjelek között kell beillesztenünk a függvénybe. Az alert segítségével a változók értékeit is megjeleníthetjük, de errõl majd késõbb lesz szó.

Fontos események

Nem csak a mi életünkben, hanem HTML oldalunk életében is vannak fontos események, például amikor valaki végre betölti lapunkat, amikor kattint rajta, vagy amikor elhagyja azt. Ezeket az eseményeket, vagy ha jobban tetszik felhasználói interakciókat scriptünk képes lekezelni beépített eseményekezelõi segítségével. A legfontosabb eseményeket foglaljuk össze az alábbiakban.
 

Esemény neve

Eseménykezelõ

Mikor következik be

load

onLoad

a HTML oldal betöltésekor

click

onClick

az objektumra történõ kattintáskor

change

onChange

ha az ûrlap mezõjének értéke megváltozik

mouseover

onMouseOver

az egérmutató az objektum fölött van

A felsorolás természetesen nem teljes, azonban néhány alapvetõ ismeretet szerezhetünk belõle. Az elsõ, amit fontos tudni, hogy értelemszerûen nem minden objektumhoz rendelhetünk hozzá minden eseményt (a késõbbiekben egy nagyobb táblázat segít majd ebben eligazodni). A második fontos tudnivaló az eseménykezelõk helyes leírásának módja, a JavaScript ugyanis - akárcsak az igazi Java - különbséget tesz a kis és nagybetûk között. Ennek megfelelõen az eseménykezelõk neveit mindig kis kezdõbetûvel, a szóösszetételeknél azonban nagybetûvel kell írni, így lesz az onmouseover-bõl onMouseOver.

Használjuk amit tudunk, 2. példa

A következõ példában tudjuk is alkalmazni a most megszerzett ismereteinket. A feladat kicsit bonyolódott, de a HTML-t ismerõk számára azért könnyen értelmezhetõ lesz. Mindössze annyi a dolgunk, hogy egy gombra való kattintáskor írjuk ki a "Rámkattintottál!" szöveget. Ehhez létre kell hoznunk egy HTML formot, amibe beágyazhatjuk a gombot. A HTML kód ismertetésébe most nem szeretnék belebonyolódni, hiszen a cikknek ez nem témája. A gombra való kattintáskor tehát bekövetkezik egy Click esemény, mely meghívja az onClick eseménykezelõt, melynek hatására lefut a scriptünk, és kiírja a szöveget. A forráskód tehát a következõ:

<HTML>
<BODY>
<FORM>
<INPUT TYPE="BUTTON" NAME="GOMB" VALUE="Kattints ide!"
   onClick= "alert('Rámkattintottál!')">

</FORM>
</BODY>
</HTML>

A fentiekbõl remélem teljesen egyértelmû mit miért csináltunk, de az idézõjelek helyes használatára azért szeretném mindenki figyelmét felhívni. Scriptünk írása közben ugyanis használhatunk szimpla és dupla idézõjeleket is, és kombinálhatjuk is õket, de mindig ügyeljünk a sorrendre. Ha egy szöveget szimpla idézõjellel kezdtünk, akkor azzal is zárjuk be, egyértelmûen kifejezve ezzel a szöveg és az utasítás határait.

Link a Script-re

Ennek a fejezetnek két fontos tanulsága lesz. Az elsõ, hogy a JavaScriptünket nemcsak események hatására hívhatjuk meg, hanem szabványos HTML linkek segítségével is, a második pedig az, hogy ahány böngészõ, annyi szokás. Mit is jelent ez? Azt már tudjuk, hogy a Netscape-ben jelent meg elõször a JavaScript, és mint látványos és jól használható scriptnyelv hamarosan el is terjedt, és több böngészõbe is beépítették. A böngészõk fejlesztõi azonban nem egységesen implementálták a nyelvet, és ez érdekes megoldásokhoz vezetett. IE 4.0 alatt tesztelve oldalunkat semmi baj nem származik abból, ha egy képhez rendeljük hozzá az onClick eseményt - ami a JavaScript szabályai szerint súlyos hibának számít - sõt, oldalunk még megfelelõen is fog mûködni. Ha azonban ezt az oldalt a Netscape valamely kiadásával tekintjük meg jobb esetben nem történik semmi, ha a képre kattintunk, rosszabb esetben hibaüzenetet is kapunk. Akkor vajon mi a teendõ ha egy képhez az onClick eseménykezelõt  szeretnénk rendelni, és szeretnénk oldalunkat lehetõleg Netscape és Opera böngészõkkel is élvezhetõvé tenni? Ekkor használhatjuk a következõ megoldást: képhez ugyan nem, de linkhez már rendelhetünk Click eseményt. Tehát a képet, mint szabványos linket hozzuk létre viszont href attribútumának a következõ értéket adjuk: href="javascript:void(utasítások, függvények)". Talán egy példa segíteni fog az elõbbiek megértésében.

<HTML>
<BODY>
<a href=" javascript:void(alert ('Mûködik!'))"> link, ami akár egy kép is lehet</a>
</BODY>
</HTML>

Tehát létrehoztunk egy linket -  ami nem csak szöveg, hanem akár egy kép is lehet - aminek href tagjában megadtuk, hogy a link valójában nem egy másik HTML oldalra mutat, hanem egy JavaScript utasításra, ami esetünkben az alert függvény meghívása. Jogos a kérdés, hogy miért kell az egészet zárójelbe tenni, és még azt is eléírni, hogy void? A válasz egyszerû: a függvény értéket adhat vissza, és a visszaadott érték a képernyõn jelenne meg, amit viszont a VOID() megakadályoz. Ezt a megoldást csak akkor kell alkalmaznunk, ha a meghívott eljárásnak van visszaadott értéke, tehát esetünkben nem.

Csoportosítsunk, avagy a függvények

A függvények jelentõségének megértéséhez képzeljük el, hogy egy gombra való kattintáskor két lépésbõl álló mûveletsort kell elvégeznünk: le kell ellenõriznünk egy megadott mezõ értékét, és ha helyes, akkor el kell küldenünk azt a szervernek. Mi a teendõ ilyenkor? Rakjuk az egészet az eseménykezelõ meghívásába? Megtehetjük, de van szebb megoldás is: használjunk függvényeket. A függvényeket teljesen szabadon definiálhatjuk a következõ szintaktikával:

function fuggveny(valtozo)

Az ellenõrzést és az adatok elküldését elvégezhetjük egy függvény segítségével, így az eseménykezelõ meghívása után csak a függvényünk nevét kell írnunk. Ennek a függvénynek átadjuk az ûrlap megfelelõ mezõjének értékét és kezdõdhet is a vizsgálat. Az ilyen függvényeket a HTML dokumentum elején szokás definiálni, elkerülve azt, hogy elõbb hívjuk meg a függvényt, mint ahogy a leírása szerepelne. A legcélszerûbb ha függvényeinket még a fejrészben deklaráljuk, így ezek a problémák nem fordulhatnak elõ. A függvény írása  során egész csomó változóval dolgozhatunk, így fontos hogy ismerjük azok hatáskörét. A változók érvényességi köre attól függ, hogy hol deklaráltuk õket. Ha a függvényeken kívül, akkor az egész dokumentumra érvényes, ha függvényen belül, akkor csak az adott függvényen belül érhetjük el õket.
A függvények használatát mutatja be a következõ egyszerû példa, mely egy figyelmeztetõ ablakban írja ki, hogy az OK és a Mégse lehetõségek közül melyiket választottuk. A feladat nem túl bonyolult, nem is használja ki a függvények fenti sorokban leírt tulajdonságait, de talán érthetõvé teszi használatuk okát.

<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">


 function dontes()
</SCRIPT>
</HEAD>
<BODY>
<FORM>
<input type="button" value="Válassz!" onClick="dontes()">
</FORM>
</BODY>
</HTML>

Ha utasításainkat nem csoportosítjuk egy függvénybe már egy ilyen egyszerû feladat is teljesen átláthatatlan forráskódot eredményezhet, hiszen a függvényben szereplõ utasítások mind egy sorba kerültek volna. A fenti script értelmezéséhez néhány alapvetõ ismeret azért szükséges. A CONFIRM() metódus egy választó-ablakot jelenít meg a képernyõn, ahol az OK és a Mégsem lehetõségek közül választhatunk. Ha az OK-t választjuk az eljárás igaz értékkel tér vissza, ha a Mégse gombra kattintunk hamis a visszatérési érték. Ennek megfelelõen a függvényben lévõ feltétel teljesül, illetve nem teljesül, tehát a választásunknak megfelelõ figyelmeztetõ ablak jelenik meg a képernyõn.
Eddig még nem szóltunk a függvények alkalmazásának másik elõnyérõl: nevezetesen arról, hogy az ilyen módon megírt függvények funkcióit az oldalon, vagy más oldalakon többször is igénybe vehetjük, anélkül hogy újra meg kellene írnunk az egészet. Ahhoz, hogy mélyebben megismerkedjünk a JavaScript-tel, nagyon fontos megérteni a következõ fejezetet.

Objektumok, dokumentumok

Tudjuk, hogy a JavaScript objektum alapú, és nem objektum orientált nyelv, hiszen az objektumok egy szinten helyezkednek el, objektumai között mégis szoros, alá és fölérendeltségi viszony figyelhetõ meg. Az egész HTML dokumentumunk ilyen objektumokból épül fel, melyek alapkontextusát a window objektum adja. Az objektumoknak további objektumai, tulajdonságai és metódusai is lehetnek, amelyekre a pont-operátor segítségével hivatkozhatunk. Lássunk egy egyszerû példát: ha a HTML oldalunk URL-jét akarjuk megtudni, tehát azt az Internet-címet, amin keresztül a lapot elérjük, a document objektum location objektumának értékét kell kiíratnunk: document.location. Az objektumok metódusait is hasonló módon érhetjük el: a dokumentum név mezõjére való fókuszáláshoz például a mezõhöz tartozó FOCUS() metódust kell meghívnunk: document.form.név.focus().
Az objektumokat nagyon sokféle módon elérhetjük programozás során, ami megkönnyíti a munkát, viszont nagyon zavaró is lehet, ha valaki nincs tisztában az objektumok hierarchiájával, ezért jól jöhet a következõ segítség. A teljes HTML dokumentum objektumok sokaságából épül fel, és a JavaScript segítségével szinte minden egyes objektumnak meg tudjuk változtatni az összes tulajdonságát - hiszen erre találták ki. Építsünk fel egy HTML ûrlapot, mely telis-tele van különbözõ beviteli mezõkkel rádiógombokkal, és checkbox-okkal. Ennek a dokumentumnak a fõ objektuma a document objektum. Ennek további objektumai a formok, melyek további objektumokként tartalmazzák a beviteli mezõket. A beviteli mezõknek pedig további metódusai és tulajdonságai lehetnek. Így tehát egy beviteli mezõ értékét a következõképpen érhetjük el: document.form.mezo.value. Aki eddig követni tudta, most lehet, hogy elveszti a fonalat: az objektumoknak ugyanis nem kötelezõ, de lehet nevet adni. Az objektumok ekkor háromféle módon érhetõk el. Az elõbbi példánál maradva: a beviteli mezõ értéke a következõképpen érhetõ el:

- document.form.mezo. value - document.forms[0].elements[0]. value - document.forms ['form'].elements['mezo'].value

Annak érdekében, hogy teljes legyen a káosz a fenti elérési módozatokat kombinálhatjuk is. Sokat segíthet azonban, ha tudjuk, hogy a dokumentum elemei a lap tetejétõl kezdve kerülnek beszámozásra, tehát a document.forms[0] a dokumentum tetejéhez legközelebb esõ HTML formot jelenti. A fentiek megemésztésében jól jöhet a következõ példa:

9. Az oldal tulajdonságainak módosítása

A feladatunk mindössze annyi lesz, hogy az elõbbiekben leírtakat megpróbáljuk a gyakorlatban alkalmazni. Létrehozunk egy formot egy beviteli mezõvel, amelynek kiírjuk, majd megváltoztatjuk az értékét. Ehhez két függvényt fogunk használni, egyet a kiíráshoz és egyet a megváltoztatáshoz.

<HTML>
<HEAD>
<SCRIPT LANGUGE="JavaScript">
 function kiiras(mezo)
 function valtoztatas()
</SCRIPT>
</HEAD>
<BODY>
<FORM name="form">
<input type="text" name="szoveg">
<input type="button" value="Kiir" onClick="kiiras (document.form.szoveg.value)">
<input type="button" value="Valtoztat" onClick="valtoztatas()">
</FORM>
</BODY>
</HTML>

Ahhoz hogy a fent leírt feladatot el tudjuk végezni a KIIRAS() függvény meg kell hogy kapja a beviteli mezõ értékét meghívásakor, mely jelen esetben a document.form.szoveg.value tulajdonságon keresztül érhetõ el. A VALTOZTATAS() eljárásnak ezzel szemben nincs szüksége semmilyen paraméterre, hiszen feladata csak annyi, hogy a mezõ értékét megváltoztassa. A fenti példa ugyan nagyon egyszerû, de vegyük észre, hogy ezzel a módszerrel, tehát egy egyszerû értékadással, módosíthatjuk minden objektum tulajdonságát, dinamikusan változtatva ezzel oldalunk megjelenését. Kicserélhetjük a háttérszínt, de akár a betûk színét is megváltoztathatjuk. Ezeket a lehetõségeket a késõbbiekben részletesen is bemutatom majd.
Most térjünk még vissza az elõbbi példához. Mi van akkor, ha a beviteli mezõnek nem adunk nevet, akkor a változtatáskor hogyan érhetjük el a beviteli mezõnk értékét. A válasz egyszerû, a fentiekben leírt módon. Ha tehát az VALTOZTATAS() függvényt kicseréljük a következõre, minden ugyanúgy fog mûködni.

function valtoztatas()

Ha hibáztunk

Mi történik, ha hibát vétünk a program írása közben? A többi programozási nyelvben ilyenkor a fordítótól figyelmeztetést vagy hibaüzenetet kapunk. JavaScript esetében a fordítást és a futtatást is egy böngészõ végzi, így a hibajelzéseket innen kell várnunk, néhány esetben sajnos hiába. Azért hiába, mert a böngészõk "természetesen" ebben is különböznek. A legfejlettebb hibajelzéssel a Netscape rendelkezik, az Explorer már kicsit szûkmarkúbb, az Operát pedig még soha nem sikerült rábírnom hogy jelezze a hibát. Menjünk akkor szépen sorban.
Ha a Netscape hibát jelez ("Javascript error!" Felirat jelenik meg az állapot sorban), akkor a címsorba kell beírnunk a "javascript:" sort, és máris rámutat a hiba okára. Ez a funkció akkor is jól használható, ha csak ellenõrizni szeretnénk egy-egy utasítást, mivel azokat itt is tesztelhetjük. Írjuk be a címsorba, hogy "javascript:alert('Hiba')" és máris megjelenik a figyelmeztetõ ablak. Ez a funkció rendkívül egyszerûen és hatékonyan használható.
Az Explorer szolídabban (egy kis sárga háromszög a status sor sarkában) jelzi a hibánkat, és a hiba okának felderítésében sem jár el a Netscape gondosságával.
Az Opera, annak ellenére, hogy remek böngészõ, sajnos semmilyen segítséget nem nyújt a hibák felderítésében, egyszerûen csak nem futtatja le a JavaScriptet, ha hibát talál.

További lehetõségek

A fent leírtak természetesen nem merítik ki a JavaScript lehetõségeit, azokról még oldalakat lehetne írni, de azt hiszem jó áttekintést adnak a szolgáltatások sokszínûségérõl. A mostani rövid leírások után a továbbiakban részletesebben is meg fogunk ismerkedni az egyes funkciókban rejlõ lehetõségekkel, és remélem használható példákkal tudok szolgálni, amiket mindenki felhasználhat majd saját honlapja szebbé és látványosabbá tételében. Addig is mindenkinek ajánlom, hogy nézze át, gépelje be és futtassa le a fenti példákat, szerkessze át õket, és akkor kedvet fog kapni, hogy megismerje ezt az egyszerû, de rendkívül jól használható nyelvet.



Események

Ahhoz, hogy hatékonyan használhassuk a JavaScript nyelvet, szükségünk lesz egész csomó esemény kezelésére, hiszen a felhasználói beavatkozások, tevékenységek irányítják lapunk mûködését. Az események lekezeléséhez - mint már tudjuk - eseménykezelõket kell használnunk. Ezek egy kis részét már ismerjük, de a programozás során sokkal több esemény megkülönböztetésére lesz szükségünk. Amit fontos még tudni, hogy nem minden esemény rendelhetõ hozzá minden objektumhoz, elemhez. Hogy tisztán lássuk az események - eseménykezelõk - objektumok viszonyát, nézzük meg alaposan az alábbi táblázatot.
 
 

esemény

eseménykezelõ

objektum

Akkor következik be...

blur

onBlur

window, frame, form

elemei ha a fókusz egy másik objektumra kerül

click

onClick

gomb, radio-gomb, checkbox,link

ha az objektumra kattintunk

change

onChange

text,textarea,select

ha megváltozik az adott mezõ értéke

focus

onFocus

window, frame, form

elemei ha a fókusz az elemre kerül

keydown

onKeyDown

document, image, link, text, textarea

ha egy billentyû lenyomásra kerül

keyup

onKeyUp

document, image, link, text, textarea

ha egy billentyû felengedésre kerül

load

onLoad

document

amikor a HTML oldal betöltõdik

mouseout

onMouseOut

area, link

ha az egér elhagyja az objektumot

Mouseover

onMouseOver

area, link

ha az egér az elem fölé kerül

Select

onSelect

text, textarea

ha a mezõ valamely részét kiválasztjuk

Submit

onSubmit

form

ha a submit gombra kattintunk

események - eseménykezelõk - objektumok

Ha esetleg a fenti táblázat értelmezéséhez íme egy kis magyarázat: az elsõ oszlopban szerepel az esemény neve, a másodikban a hozzá tartozó eseménykezelõ, a harmadik oszlop tartalmazza azon objektumok listáját, melyekhez az eseménykezelõ hozzárendelhetõ, és végül a negyedik oszlopban láthatjuk, hogy az adott esemény mikor következik be.
Mivel a múltkori rész kicsit szárazra sikerült, és nem szeretnék újra ebbe a hibába esni, most használjuk is fel a fentieket valamilyen gyakorlati példán!


Változó képek

Mielõtt megvizsgálnánk a forráskódot, idézzük fel, hogyan is érhetünk el egy képet a HTML oldalunkon. Igen, igen, ennek meglehetõsen sok módja van, most a legegyszerûbbet választjuk: nevet adunk a "gyereknek". Ezt úgy tehetjük meg, hogy a kép beillesztésénél az <IMG> tag-be berakjuk a NAME="kep" attribútumot. Ha ezt megtettük, képünkre a következõ módon hivatkozhatunk: document.kep, a forrásfájlt pedig a document.kep.src tulajdonságon keresztül érhetjük el, illetve változtathatjuk meg.
A feladat rendkívül egyszerû lesz: változzon meg a kép, ha a felhasználó fölé viszi az egeret, nyerje vissza eredeti állapotát, ha elvitte onnan, és legyen más akkor is, ha rákattintottunk. Elsõ látásra talán kicsit bonyolultnak tûnik a feladat, de vegyük sorra a szükséges ismereteket. Elõször is meg kell tudnunk különböztetni a látogató interakcióit: a kép fölött van, vagy klikkel stb. Ezt azonban eddigi tudásunkkal már meg tudjuk tenni, hiszen az elõbb ismertetett események között ezek is szerepelnek. A másik probléma, hogy a megfelelõ eseménykezelõk meghívásakor cserélõdjenek ki a képek. Ezt is egyszerûen meg tudjuk oldani. Mindössze annyit kell tennünk, hogy a document.kep.src attribútumát meg kell változtatnunk, mégpedig annak a fájlnak az elérési útját kell neki értékül adnunk, amelyik az új képet tartalmazza. Most, hogy minden ismeretnek birtokában vagyunk, lássuk a programot:

<html>
<body>
<a href="javascript:alert ('Lenyomva is más a kép, de sajnos hamar visszaugrik')">
<img name="kep" src="1.jpg"
  onMouseOver= "document.kep.src='2.jpg'"
  onMouseOut= "document.kep.src='1.jpg'"
  onClick= "document.kep.src='3.jpg'">
</a>
</body>
</html>

Még egy kis magyarázatot azért fûznék a fenti példához: az 1.jpg fájlban található az alapesetben megjelenõ kép, a 2.jpg-ben a "Fölöttem az egér" feliratú gomb, míg a 3.jpg tartalmazza a kattintáskor megjelenõ képet. Mivel az egérrel kattintás csak rövid ideig tart, ezért a 3-as számú képünk megjelenését nem is veszzük észre, de egy kis alert ablak azért tájékoztat bennünket, hogy az esemény bekövetkezett.
Azt hiszem senkinek nem okozott gondot a példa értelmezése, ezért most lépjünk tovább, de csak egy kicsivel. Mi történik, ha a cserélendõ képek túl nagyok, vagy a felhasználó sávszélessége túl kicsi? Nagyon egyszerû, a képek kisebb nagyobb késéssel fognak megjelenni, hiszen letöltésük csak az elsõ hivatkozás pillanatában fog elkezdõdni (azaz pl. a 2.jpg akkor, amikor elõször mozgatjuk az egeret a kép fölé), és a kicsi sávszélesség miatt akár jó néhány másodpercbe is beletelhet mire  a böngészõnek sikerül a képet letöltenie, és végre megjelenítheti azt. Ez idõnként elég zavaró lehet. Azonban erre is van megoldás.


Elõtöltött képek

A fenti probléma megoldása nem is annyira egyszerû, mint amennyire gondolnánk. Létre kell hoznunk új objektumokat, mégpedig olyanokat, amelyek képek, de nem jelennek meg az oldal betöltõdéskor a dokumentum felületén. Ezt az Image objektum használatával érhetjük el. Lássuk elõször a forráskódot, majd sorról sorra a magyarázatot.

<html>
<script>

elsoKep = new Image();
elsoKep.src = "1.jpg";
masodikKep = new Image();
masodikKep.src = "2.jpg";

function kepMutat(forras)

</script>

<body>
<a href="javascript:alert('Elõre töltött képekkel...')">
<img name="kep" src="1.jpg"
 onMouseOver="kepMutat(2)"
 onMouseOut="kepMutat(1)">
</body>
</html>

A HTML kód remélem már mindenkinek világos: létrehozunk egy képet - ami feltétlenül link kell, hogy legyen -, amely különbözõ események hatására különbözõ függvényeket hív meg. A hangsúly itt a függvényeken, illetve a JavaScript kódon van. A script törzsében - tehát a függvény definícióján kívül - létrehozunk két új objektumot, melyek így a függvénybõl és azon kívülrõl is elérhetõek lesznek. Ezek az objektumok Image, azaz kép objektumok, melyeket a következõképpen hoztunk létre: elsoKep = new Image(). Tehát az elsoKep egy új (new) kép objektum lesz (Image), melynek, a következõ sorban, az src attribútumában megadjuk a képet tartalmazó fájlnak a nevét. Hasonlóan hozzuk létre a második képünket is. Ezzel a módszerrel a képek már az oldal letöltésre kerülnek a memóriába vagy a böngészõ helyi gyorsítótárába, így a képcserekor csak meg kell jeleníteni õket, nem kell azok letöltésére várnunk. Nincs más dolgunk, mint írni egy függvényt, ami a képek attribútumainak változtatásait elvégzi. Erre a feladatra szolgál a kepMutat eljárás, ami a paraméterétõl függõen az elsoKep vagy a masodikKep objektumokban tárolt képeket jeleníti meg, egy feltételtõl függõen.
A fenti módszerek alkalmazásával - akár többtucat képet is használhatunk - nagyon látványossá tehetünk már egy egyszerû oldalt is, azonban itt sem érdemes túlzásokba esni, és túldíszíteni a lapunkat.


Idõzítések

Az oldalak díszítésérõl, látványosabbá tételérõl szól a következõ fejezet is, de ehhez némi tudást kell magunkévá tennünk, meg kell ismerkednünk az idõzítéssel és a böngészõ status sorával is.
A JavaScript lehetõséget ad az utasítások idõzítésére. Ez az idõzítés tulajdonképpen azt jelenti, hogy az adott utasítás csak bizonyos idõ múlva fog végrehajtódni. Erre a funkcióra sokszor szükségünk lehet, ha valamit késleltetni szeretnénk, például a felhasználónak idõt szeretnénk adni egy szöveg elolvasására, mielõtt új oldalt töltenénk be. Az ilyen esetekre találták ki a setTimeout() metódust, melynek paraméterei a következõk: setTimeout("utasítás",idõ). Az eljárás a paraméterül kapott utasítást - melyet mindig idézõjelek közé kell tennünk - csak adott idõ múlva hajtja végre. Ha tehát azt szeretnénk, hogy 5 másodperc múlva ugorjunk egy másik oldalra, akkor a következõ utasítást kell használnunk: setTimeout("location.href='uj_oldal.html'",5000), ugyanis az idõ paraméteréül szolgáló számokat milliszekundumokban (azaz ezred másodpercekben) kell megadnunk.
A következõ egyszerû példa segít megérteni az idõzítések használatának okát, és egy kis segítséget ad a következõ fejezethez is. Feladatunk az lesz, hogy egy beviteli mezõben bizonyos késleltetéssel írjunk ki egy szöveget, mintha valaki éppen most gépelné be azt. Lássuk elõször a forráskódot majd a hozzá tartozó magyarázatot.

<html>
<script>

function kiiras()
 }

</script>
<body onLoad="kiiras()">
<form name='form'>
<input type='text' name='mezo' size='35'>
</form>
</body>
</html>

A lényeg - mint mindig - ezúttal is a JavaScript részben van. A HTML kódban mindössze egy beviteli mezõt definiálunk a hozzá tartozó form-mal, és az oldal betöltõdésekor meghívjuk a kiiras eljárást. Nézzük akkor a függvényünket sorról sorra. Az elsõ sorban definiálunk egy változót, melyben elhelyezzük a kiírandó szöveget. A második sorban létrehozunk még egy változót, melyben a már kiírt szöveget tároljuk el. Mivel szükségünk lesz mind a kiírandó, mind a kiírt szöveg hosszára, ezért a következõ utasítások segítségével ezt a két értéket tároljuk el egy-egy változóban. Következik egy feltétel, mely eldönti, hogy folytassuk-e a kiíratást, vagy befejezõdhet scriptünk futása, azaz már kiírtuk a kívánt szöveget. Ebbõl következõen a feltétel igaz, ha a kiírt szöveg hossza kisebb, mint a kiírandóé. Ekkor a kiírt karakterek számát növeljük a substring metódus segítségével, majd újra meghívjuk függvényünket, egy kis késleltetés beiktatásával.
Azt hiszem, nem árt, ha a feltétel igaz ágában szereplõ két sort kicsi tovább elemezzük. A kiirandoSzoveg változónak használjuk a substring metódusát, melynek két paramétere van. Az elsõ paraméter mondja meg, hogy hányadik karaktertõl kezdve, a második pedig hogy hányadik karakterig írjuk ki a stringet. Tehát ha stringünk a"valami" szóból áll, akkor annak string.substring(0,2) metódusa a "va" szótagot adja vissza értékül. Mivel esetünkben a második paraméter mindig egyel növekszik, így minden lépésben egyel több karakter jelenik meg a kiírandó stringbõl a képernyõn. Most következik a késleltetés, mely 0,3 másodperc múlva újra meghívja a kiiras() eljárást, és így újabb betû jelenhet  meg a beviteli mezõben.
Ezt a módszert, amikor a függvény saját magát hívja meg rekurziónak nevezzük, és ilyen, vagy ehhez hasonló problémák (faktoriális kiszámítása) nagyon jó hasznát vehetjük. Talán felmerül a kérdés a kedves olvasóban, hogy miért volt szükség a fenti példára, hiszen ennek nem sok hasznát vehetjük egy valódi oldal elkészítésében. A kérdésre a következõ fejezetben kaphatunk választ.

Status sor

A díszítésnek, szépítésnek pár évvel ezelõtt nagyon kedvelt eszköze volt a status sor telezsúfolása különbözõ ide-oda mozgó szövegekkel, majd - ahogy az lenni szokott - "kiment a divatból". Ennek oka leginkább az volt, hogy mindenki, minden helyzetben és szinte mindent itt jelenített meg, és így meglehetõsen elcsépelté vált. A status sor egyébként - ha valaki esetleg nem tudná - a böngészõk alján lévõ, általában üres, keskeny, szürke sáv, ahol különbözõ információkat szokott a böngészõ megjeleníteni, az oldal letöltésével és a linkekkel kapcsolatban. Ha ízlésesen és informatívan használjuk ki ezt az apró kis helyet, elkerülhetjük a túlzsúfoltság érzését, és hasznos információkkal láthatjuk el az oldalunkra tévedt látogatókat.
A status sorban állandó és változó információk is megjelenhetnek, éppúgy, mint egy beviteli mezõben. A két mezõbe való írás módja sem tér el jelentõsen egymástól, így kézenfekvõ, hogy az elõbbi példában használt szövegkiíró scriptet ültessük át a status sorra. A kód csak annyiban változik, hogy nem kell formot deklarálnunk, és a beviteli mezõ helyett a scriptünk kimenete a status sor lesz.

<html>
<script>

function kiiras()
 }

</script>
<body onLoad="kiiras()">
Ne ide nézz, hanem egy kicsit lejjebb...
</body>
</html>

A kódban történt változtatások szerintem maguktól értetõdõek, ezért nem is szeretném túlmagyarázni a dolgot. A scriptünkkel - remélhetõleg - csak egyetlen gond van, mégpedig az, hogy ugyan hajlandó kiírni a szöveget, azonban futása ekkor be is fejezõdik, és a status sor újra unalmassá válik. Erre a problémára nyújt gyógyírt a következõ példa.

Status sor törléssel

A feladatot tovább bonyolítjuk: a szöveg megjelenítése után scriptünk törölje is azt le, majd újra írja vissza, utánozva ezzel valamiféle reklámcsíkot. Ezzel oldalunk állandó mozgásban lesz tartava, és ne ül rá a szürke egyhangúság.
A kódunk hosszra nem sokat, tartalmilag viszont annál többet fog változni. Elõször is tudnunk kell, hogy milyen irányba haladunk a kiírással, írunk, vagy éppen törlünk. Ennek érdekében a   script törzsében deklarálunk egy változót torles névvel, melynek kezdeti értékét 0-ba állítjuk, jelezve ezzel, hogy nem törlünk, hanem írunk. Ezek után a kiírást végzõ függvényünkben a kapcsolóként viselkedõ torles változót átállítjuk, vagy változatlanul hagyjuk a kívánt funkciótól függõen. Átkapcsolásra akkor van szükség, ha a sor végére értünk, azaz a kiírt szöveg hossza megegyezik a kiírandó szöveg hosszával, vagy akkor, ha ismét a sor elejére értünk, azaz a kiírt szövegünk hossza nulla. A kapcsoló állásától függõen a szöveget tartalmazó stringünkbõl egyel hosszabb, vagy egyel rövidebb rész-stringet íratunk ki a substring metódus segítségével. Ha ezzel készen vagyunk következik a rekurzió, majd a függény lezárása. Most hogy tudjuk mit is kellene csinálnunk, lássuk a forráskódot.

<html>
<script>

var torles=0;

function kiiras()

</script>
<body onLoad="kiiras()">
Ne ide nézz, hanem egy kicsit lejjebb...
</body>
</html>

A fenti program paramétereinek megváltoztatásával, tetszõleges szöveget kiírathatunk, az általunk beállított gyorsasággal. A script egyszerûen a kivág-beilleszt módszer alkalmazásával beágyazható bármely HTML oldalba.
Scriptünk segítségével most már mindenféle egyszerûbb feladatot elvégeztünk: képeket cserélgetünk, ablakokat jelenítetünk meg, de vajon komolyabb, vagy komolyabbnak tûnõ problémák megoldhatók-e segítségével? Hogy a JavaScript bonyolult, vagy annak látszó feladatok megoldására mennyire alkalmas, azt jól szemlélteti a következõ példa.

Le az ékezetekkel!

Egy ismerõsöm vetette fel azt a problémát, hogy egy szövegbõl távolítsuk el az ékezetes karaktereket. Õ egy sms-küldõ oldalon látott egy programot, amely a beírás pillanatában kicserélte az ékezetes betûket ékezet nélküli párjukra. Mivel kíváncsi voltam a megoldásra, ezért gondolkodni kezdtem, melynek a következõ kis programocska lett az eredménye:

<html>
<script>

function check()
 if (ujKarakter)
  document.form.text.value= document.form.text.value.substring (0, document.form.text. value.length-1) + ujKarakter;

</script>
<body>
Ide lehet bepötyögni a szöveget, amibõl majd kiszedjük az ékezetes betûket:<br>
<form name="form">
<textarea name="text" rows="10" cols="30" onKeyUp="check()"></textarea>
</form>
</body>
</html>

A HTML kód most is meglehetõsen egyszerû, a lényegi munkát a JavaScript látja el. Létrehoztunk egy form-ot egy beviteli mezõvel, és megadtuk, hogy minden egyes billentyû lenyomása után fusson le az általunk megírt ellenõrzõ függvény. Metódusunk nem túl bonyolult mindössze egy változó definíciót, egy switch-case szerkezetet, és egy feltételt tartalmaz. Az elsõ lépésben beolvassuk a beviteli mezõben lévõ sztringet, és levágjuk róla az utolsó karaktert, hiszen elég ezt vizsgálnunk. Ezek után el kell döntenünk, hogy mit tegyünk ezzel a karakterrel. Ehhez egy switch-case szerkezetet használhatunk, mely a következõképpen mûködik. A switch a paraméterként megkapott változó, switch(valtozo), értékétõl függõen különbözõ utasításokat hajt végre. Ezeket az értékeket és a hozzájuk tartozó utasításokat a case "érték" : utasítás szintaktikával definiálhatjuk. A switch sajátossága, hogy minden egyes ilyen sor után, ha nem akarjuk, hogy a következõ is végrehajtódjon, egy break utasítást kell írnunk. Ennek megfelelõen a case "é" : ujKarakter="e"; break; sor abban az esetben, ha az utolsó leütött karakter "é" volt az ujKarakter változónak az "e" karaktert adja értékül, és befejezi a vizsgálatot. Mivel ezt minden ékezetes betûre elvégeztük, így mindegyik helyére saját ékezet nélküli párja helyettesítõdik majd be. Ehhez azonban szükség van még egy lépésre: meg kell vizsgálnunk, hogy megváltoztattuk-e a karaktert, azaz az ujKarakter változóba került-e valami. Ha a feltétel igaznak bizonyul, akkor a beviteli mezõben lévõ stringhez a függvény által visszaadott karaktert fûzzük, a feltétel hamis volta esetén nem történik semmi. És ezzel meg is oldottuk a sokak számára megoldhatatlanak, de legalábbis rejtélyesnek tûnõ feladatot.

Ékezettelenítés 2.0

A - mondjuk úgy - 1.0-ás verziónak két, viszonylag nagy, hibája van. Az egyik, hogy csak az utolsó karaktert vizsgálja, így ha valaki utólag szúr be valamit a szövegbe, akkor abban már nem cseréli le az ékezeteket. A másik hiba, hogy ha kivág/beilleszt módszerrel nagyobb szöveget másolunk a beviteli mezõbe, akkor az elõbb említett okokból szintén elmarad a kívánt hatás. Mindkét probléma orvosolható a következõ módszerrel. Minden egyes bevitelkor, egy for ciklus segítségével, az egész szöveget leellenõrizzük. Következzen most a javított változat, és egy kis magyarázat hozzá:

<html>
<script>

function check()

if (ujKarakter)

}


</script>
<body>
Ide lehet bepötyögni a szöveget, amibõl majd kiszedjük az ékezetes betûket:<br>
<form name="form">
<textarea name="text" rows="10" cols="30" onKeyUp="check()"></textarea>
</form>
</body>
</html>

Akkor lássuk mi is változott. A HTML form, illetve az ékezetek kiszûrését végzõ switch-case szerkezet, teljes egészében ugyan az, mint az elõzõ programban. Változott viszont a függvényünk szerkezete, és néhány utasítása. Az elsõ sorban egy egyszerû értékadással kiküszöböljük, a változónevek hosszú, és fáradságos begépelését. Ezek után egy for ciklus segítségével végigmegyünk az egész string-en, és egyesével levizsgáljuk a karaktereket. A karakterek eléréséhez a substring metódust használjuk a megfelelõ paraméterezéssel. Megadjuk neki a kezdõ és vég indexet, amelyek közötti részre kíváncsiak vagyunk. A kiválasztás után következik a már ismert vizsgálat.

A vizsgálat végén ellenõrizzük, hogy kellet-e változtatni az aktuális karaktert. Ha igen, akkor visszahelyezzük azt a szövegbe. És itt van a másik fontos változás. Mivel eddig csak az utolsó karaktert vizsgáltuk, nem volt nehéz dolgunk, de itt már több figyelmet igényel a feladat, hiszen a karakter akár a szöveg közepén is lehet. A megoldás az, hogy létrehozunk egy új string-et, amely a következõképpen áll össze: a változtatott karakter elõtti rész plusz az aktuális karakter, és ehhez hozzáfûzzük a maradék szöveget. Ezt az értéket visszaírjuk a beviteli mezõbe, és már kész is vagyunk a feladattal.

Ez a script kiküszöböli a beillesztésbõl adódó hibákat is, mivel minden egyes karakter begépelésekor levizsgálja az egész szöveget.

Folytassuk a gyakorlati problémák megoldását egy újabb életszerû példával.


Ellenõrzések

A valódi internetes oldalak kialakításakor általában szükség van adatok bevitelére a felhasználó részérõl. Ez eddig rendben is van, azonban ezeket az adatok ellenõrizni kell a feldolgozásuk elõtt. Mivel itt kliens oldali programozásról írunk, így az adatok feldolgozásával nem, csak az ellenõrzésükkel foglalkozunk.

Ehhez szükség van HTML ismeretekre is, amit gyorsan átveszünk, hogy érthetõ legyen a probléma, és a megoldás is.

Már eddig is hoztunk létre form-okat (magyarra fordítva talán ûrlapokat), de a valódi jelentõségükrõl még nem, vagy csak alig esett szó. Ezek az ûrlapok biztosítják a felhasználó és a szerver közötti adatcserét. Az így kitöltött adatokat elküldjük a szerverre, ahol valamilyen CGI (Common Gateway Interface) program feldolgozza azt. Az ûrlap különbözõ beviteli elemekbõl áll, ezekbõl mutatok be most röviden néhányat:

típus

tulajdonságok

text

Sortörések nélküli szöveg bevitelére alkalmas mezõ.

textarea

Többsoros szöveg bevitelekor használjuk

select

Választólista, több lehetséges, rögzített érték közül választhatunk.

button

Nyomógomb, ami a felhasználói interakciókat hivatott lekezelni.

submit

Nyomógomb, ami a form adatainak elküldésére szolgál.

hidden

Speciális rejtett mezõ, amiben a szerver oldali program számára fontos adatokat kezelhetünk.

Form néhány eleme, és tulajdonságaik

A példák során csak a text, és a submit, illetve a button objektumokkal fogunk megismerkedni, mivel a feladatok nagy része ezek segítségével jól bemutatható. A késõbbiekben igyekszem majd a többi elem bemutatására is.

Egy egyszerû form a következõ elemekbõl áll: beviteli mezõk és submit vagy button nyomógomb. Általában a submit gombot használjuk az adatok elküldésére, de kerülõ úton a button gombbal is megoldható ez a feladat.

Lássunk akkor egy form-ot, melynek csak annyi a feladata, hogy két mezõ tartalmát elküldi a szervernek (a <body> és <html> tagokat most elhagyjuk):

<form name="form" action="feldolgoz.cgi" method="post">
név: <input type="text" name="nev"><br>
e-mail cím: <input type="text" name="email"><br>
<input type="submit" name="gomb" value="Elküld">
</form>

A form-nak körülbelül ezek azok a paraméterei amiket mindenképpen érdemes megadni. A name értelemszerûen az ûrlap nevét jelenti, amivel hivatkozhatunk rá. Az action jelenti annak a CGI programnak a nevét, ami a feldolgozást végzi majd. A method paraméterben adhatjuk meg, hogy milyen módon küldjük az adatokat. A post érték azt jelenti, hogy az adatokat egy "csomagként" kapja meg a szerver oldali program. A részletesebb ismertetésbe nem mennék bele, mivel elég messze sodródnánk a cikk témájától.

Amit érdemes megfigyelni az a submit gomb paraméterezése. A name magától értetõdõen az elem nevét jelenti, a value pedig azt a szöveget tartalmazza, ami a gomb felirataként megjelenik.

Ha tehát a gombra kattintunk, a mezõk tartalma a feldogoz.cgi programnak adódik át.

A küldés elõtt, mint már említettem, ellenõrizni kell az adatokat, és itt használhatjuk fel a JavaScript-et.

"Üres szöveg"

Az üres szöveg itt remélhetõleg nem a mondandóm tartalmi értékére vonatkozik. A feladatunk az lenne, hogy ellenõrizzük le küldés elõtt, hogy valamelyik mezõ tartalmaz-e üres adatokat. Ha hiányos információt adna meg valaki, akkor figyelmeztessük, és állítsuk le az adatok küldését. Ehhez az elõzõ form-ot kicsit át kell alakítanunk, és írni kell hozzá egy ellenõrzõ függvényt:

<html>
<head>
<script>

function ellenoriz()

if (document.form.email.value=="")


return true;
}

</script>
</head>
<body>
<form name="form" action="feldolgoz.cgi" method="post">
név: <input type="text" name="nev"><br>
e-mail cím: <input type="text" name="email"><br>
<input type="submit" name="gomb" value="Elküld" onClick="return ellenoriz()">
</form>
</body>
</html>

Lássuk hogyan is mûködik a dolog. Elõször is meg kell mondanunk a böngészõnek, hogy az Elküld gombra történõ kattintáskor hívja meg az ellenoriz() függvényt, és figyelje is hogy milyen értékkel tér vissza. Azt ügye tudjuk, hogy az onClick eseménnyel figyelhetjük a kattintást. Azt viszont mindeddig nem tudtuk, hogy a return kulcsszóval mondhatjuk meg, hogy a visszatérési értéket figyelembe véve küldjük el a form-ot, vagy állítsuk le a folyamatot. Ha tehát a meghívott függvény true, azaz igaz értékkel tér vissza, a folyamat tovább fut, ha azonban false, azaz hamis értékkel tér vissza a küldés megszakad.

Nincs más dolgunk tehát, csak megírni úgy a függvényt, hogy ezeket az értékeket adja vissza. Egy egyszerû if szerkezettel, pontosabban kettõvel, vizsgáljuk a mezõk tartalmát. A vizsgálat történhet a benne lévõ tartalom, vagy a tartalom hossza szerint, én az elõbbit választottam.

Tehát ha a mezõ üres, akkor egy üzenetet küldünk a felhasználó felé, majd hamis értékkel térünk vissza. Ha mindkét vizsgálaton túljutottunk, az azt jelenti, hogy nem volt hiba, és visszaadhatjuk az igaz értéket.

Itt szeretném megemlíteni, hogy az ellenõrzést más helyen is lehet végezni, de tapasztalataim szerint ez a "legböngészõkompatibilisebb" módszer. A másik eljárás egyébként a form onSubmit eseményét használni, de ez nem mindig hozza meg a kívánt eredményt.

Helyes-e?

Itt most ne a Morphologic helyesírás-ellenõrzõjére tessék gondolni. Egyszerûen csak azt fogjuk vizsgálni, hogy adott típusú adat megfelel-e bizonyos formai követelményeknek, tehát vélhetõen valós adatot visz-e be a tisztelt felhasználó.

Ahhoz hogy a vizsgálatokat el tudjuk végezni, meg kell ismerkednünk egy pár újabb string-fügvénnyel. A követezõ metódusokra lesz szükségünk:

Metódus

Mûködése

indexOf

Visszaadja az adott string-ben, egy adott karakter elsõ elõfordulásának indexét. pl.: string.indexOf("a")

lastIndexOf

Hasonló az elõzõhöz, de az utolsó elõfordulást adja vissza.

charAt

Megadja az adott string, adott indexen lévõ karakterét. pl.: string.charAt(0), visszaadja az elsõ karaktert.

Ha valaki arra gondol, hogy az ékezettelenítõ programban a charAt() függvényt is használhattuk volna az aktuális karakter kiválasztására, annak teljesen igaza van, de akkor ezt a metódust még nem ismertük.

Minden adott tehát ahhoz, hogy e-mail címet, vagy egyéb adatot vizsgáljunk.

E-mail ellenõrzés

A követezõ kis példa egy elég jól használható e-mail ellenõrzõ rutint mutat be.

<html>
<head>
<script>

function ellenoriz()

if (text.indexOf('.') == -1)
if ((text.length-text.lastIndexOf('.'))>4 || (text.length-text.lastIndexOf('.'))<2) if (text.indexOf('.')==text.indexOf('@')+1) return true; } </script> </head> <body> <form name="form" action="feldolgoz.cgi" method="post"> e-mail cím: <input type="text" name="email"><br> <input type="submit" name="gomb" value="Elküld" onClick="return ellenoriz()"> </form> </body> </html>

Az alap form, és az ellenõrzés hívása megegyezik az elõzõ példában látottakkal, azonban itt már egy jóval erõteljesebb ellenõrzésen esik át a felhasználó által megadott e-mail cím.

A már ismert értékadással indul a program, majd mindegyik if szerkezet egy bizonyos típusú hiba kiszûrését valósítja meg.

Az elsõ blokk ellenõrzi, hogy van-e "@" karakter az e-mail címben. Ezt úgy tudjuk megoldani, hogy vizsgáljuk az "@"-jel pozícióját az indexOf() metódussal. Mivel ez a függvény (-1)-et ad vissza, ha az adott karakter nem szerepel a string-ben, így az általunk kívánt feladatot tökéletesen ellátja. Tehát ha a metódus (-1)-el tér vissza a cím hibás, mivel nincs benne "@"-jel. Ha bármi más értéket ad vissza, akkor a cím átesett az elsõ ellenõrzésen.

A második lépcsõ a "." karakter meglétének vizsgálatát végzi el, hiszen e nélkül formailag biztosan hibás az e-mail cím. A vizsgált teljesen hasonló az elõbbihez. Ami esetleg újdonság lehet, az a két plusz sor a blokkokban. A document.form.email.focus() metódus a fókuszt állítja be az adott mezõre, míg a select() függvény kijelöli az adott mezõ tartalmát. Így a felhasználó egyszerûen, és gyorsan ki tudja javítani a hibáját.

Ha a második lépcsõn átesett a cím, akkor a harmadik lépcsõben további feltételeknek kell megfelelnie: megvizsgáljuk, hogy az utolsó pont után már ne lehessen három karakternél hosszabb végzõdés, hiszen az nem lehet valós cím. A cím akkor sem jó, ha ez a rész-string rövidebb mint két karakter. Ezt a vizsgálatot a lastIndexOf() metódus segítségével végezzük. Az általa visszaadott értéket kivonva a a string hosszából kapjuk a számunkra érdekes, és vizsgálandó substringet.

A negyedik lépcsõ még egy utolsó vizsgálatot végez el a címen: megnézi hogy a "@" karakter és az utána következõ "." között mennyi a távolság. Ha ez a két karakter egymás után következik, tehát az e-mail cím "közepe" üres, akkor hibát jelez.

Ha a cím minden lépcsõfokon átküzdötte magát, akkor nagy valószínûséggel valós, vagy legalább is a formai követelményeknek megfelel, így megérdemli hogy elküldjük a szervernek.

De nem csak az e-mail cím formátuma lehet érdekes, ahogy azt az utolsó példa is mutatja.

Rögzített karakterek

Ha bemutattuk a charAt() metódust, akkor használjuk is ki. Erre jó alkalom az alábbi feladat.

Megkell vizsgálnunk egy adott szót, ami csak az abc kis és nagy betûit, illetve számokat tartalmazhat. Erre olyankor lehet szükség, ha valamilyen azonosítót kérünk be, amiben nem lehet szóköz, vesszõ, vagy egyéb illegális karakter.

A vizsgálatot egy példa-string segítségével végezzük, ami tartalmazza az összes érvényes karaktert.

<html>
<head>
<script>

function ellenoriz()

}
return true;
}

</script>
</head>
<body>
<form name="form" action="feldolgoz.cgi" method="post">
azonosító: <input type="text" name="login"><br>
<input type="submit" name="gomb" value="Elküld" onClick="return ellenoriz()">
</form>
</body>
</html>

Az értelemszerûen szükséges változások magyarázatát most átugorjuk. Az alap gondolat az, hogy készítünk egy string-et, ami az összes érvényes karaktert tartalmazza. Ez a karakterlánc a feladattól függõen szûkíthetõ, vagy bõvíthetõ. Ezek után fogjuk a beolvasott szöveget, és levizsgáljuk a karaktereit, hogy benne vannak-e a megadott ellenõrzõ string-ben. Ha egyetlen olyan karaktert is találunk, amire hamis értéket kapunk, akkor az azonosítót hibásnak jelöljük meg.

A feladatot ismét az indexOf() metódussal végezzük el, kihasználva a visszaadott értékét. Segítségül hívjuk a charAt() függvényt is, a karakterek egyszerû elérése érdekében. Ha az indexOf() metódus (-1)-el tér vissza, az adott karakter illegális, tehát a függvényünk is hamis értéked ad vissza a form felé.

Érdemes megfigyelni, hogy a for ciklus inicializálásakor a var i=0 értékadást már a program törzsében használtuk. Ez jól szemlélteti a JavaScript rugalmasságát: a változókat nem csak a program elején deklarálhatjuk, hanem bárhol a programkódban. Ezzel azonban érdemes vigyázni, mert esetleg összevisszaság lehet az eredménye, ha nem logikusan végezzük a deklarációkat.


Találat: 3716


Felhasználási feltételek