Az ûrlapok
Ûrlapokkal gyakran találkozunk az Interneten. Sok oldal
ettõl nyeri az interaktivitását.
Segítségükkel a felhasználók elküldhetik
véleményüket egy oldalról, feliratkozhatnak egy
játék résztvevõi közé, megrendelhetnek
különféle tárgyakat, programokat,
szolgáltatásokat a világhálón keresztül,
kereséseket hajthatnak végre speciális keresõszervereken.
Az ûrlapokat kitöltésük után
legtöbbször elküldjük a hálózaton
keresztül egy szerveren lévõ CGI programnak, amely
feldolgozza a benne lévõ adatokat. Problémát
jelenthet viszont az, ha az ûrlapunk hibás adatot tartalmaz. Mivel
járhat ez? Elküldjük a hibás adatot a
hálózaton keresztül, ezzel gyakorlatilag feleslegesen
növelve a hálózati forgalmat. Ugyanakkor a szerveren
lévõ program sem tud mit kezdeni az adatunkkal, jobb esetben
visszaküld egy hibaüzenetet, ami tájékoztatja a
felhasználót, hogy hol rontotta el az ûrlap
kitöltését. Ezután kezdõdhet az egész
eljárás elölrõl. Ez a folyamat sok-sok
másodpercet vehet igénybe, igen lassú is lehet.
A JavaScript itt is segíthet nekünk. Még a
kitöltés fázisában, az ûrlap
tényleges elküldése elõtt ellenõrizhetjük,
hogy helyes-e a kitöltés. Ha nem, akkor nem is engedjük meg az
ûrlap elküldését. Ezzel nem okozunk
forgalomnövekedést a hálózaton, valamint a
hibaüzenetek is rögtön megjelennek a
képernyõnkön, hiszen azt nem a szerveren futó program
küldi vissza, hanem a gépünkön futó JavaScript
program.
Általában két helyen szokás az
ellenõrzést elvégezni. Minden egyes
ûrlapelemnél, amint a felhasználó kitölti azt,
az onChange, illetve elküldéskor az onSubmit
eseménykezelõ segítségével. A
következõkben több példát is látunk,
amelyekben valamilyen adat ellenõrzését
végezzük el.
Üres mezõ ellenõrzése
Leggyakrabban azt ellenõrizzük le, hogy ne legyen üres
mezõ az ûrlapban. Lássunk erre egy rövid
példát! Kattintsunk az "Ellenõrizd" gombon
elõbb úgy, hogy üresen hagyjuk a mezõt, majd
úgy is, hogy beírunk valamit!
A programunk kódja a következõ:
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!-- A JavaScript kód elrejtése
function uresCheck(mezo){
if (mezo.value != "") return true;
else{
alert("Üres mezõ!");
return false;
}
}
// -->
</SCRIPT>
</HEAD>
<BODY>
<P>
<FORM NAME="form_ures">
<INPUT TYPE="text" NAME="ures" SIZE="20">
<INPUT TYPE="button" VALUE="Ellenõrizd"
onClick="uresCheck(form_ures.ures)">
</FORM>
</BODY>
</HTML>
Ha kattintunk a gombon, meghívjuk az uresCheck() nevû
függvényt. Paraméterként a
leellenõrizendõ ûrlapmezõt adjuk át. A
függvény nem csinál mást, csak megnézi, hogy a
mezõ értéke mivel egyenlõ, ugyanis ha az nem
egyenlõ az üres sztringgel (""), akkor
kitöltöttük. Ebben az esetben true,
ellenkezõ esetben false értékkel tér vissza.
E-mail cím ellenõrzése
Szintén fontos lehet egy e-mail cím leellenõrzése.
Természetesen csak a cím formai helyességét tudjuk
vizsgálni. Minden e-mail címben szerepel "@"
karakter, illetve ezen karakter elõtt és után további
karakterek.
Ismét tekintsük meg a programot!
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!-- A JavaScript kód elrejtése
function emailCheck(mezo){
szoveg = mezo.value;
if (!(szoveg.indexOf('@')>0 && szoveg.indexOf('@')<szoveg.length-1)){
alert("Rossz e-mail cím!");
return false;
}
else{
alert("Formailag helyes e-mail cím!");
return true;
}
}
// -->
</SCRIPT>
</HEAD>
<BODY>
<P>
<FORM NAME="form_email">
<INPUT TYPE="text" NAME="email" SIZE="20">
<INPUT TYPE="button" VALUE="Ellenõrizd"
onClick="emailCheck(form_email.email)">
</FORM>
</BODY>
</HTML>
Az emailCheck() nevû függvény végzi az
ellenõrzést. Paraméternek ez a függvény is a
vizsgált ûrlapmezõt várja, mely
értékét beteszi a szoveg nevû
változóba. Az szoveg.indexOf('@')
függvénnyel lekérdezzük a '@' helyét. Ha ez
nagyobb, mint 0 (azaz nem az elsõ karakter) és kisebb, mint
szoveg.length-1 (azaz nem az utolsó karakter), akkor egy formailag
helyes e-mail címet írtunk be. Ezt még negáljuk,
hiszen elsõsorban arra vagyunk kíváncsiak, hogy mikor nem
jó a cím.
Numerikus értékek ellenõrzése
Ebben a szakaszban megnézzük, hogyan lehet megvizsgálni
azt, hogy egy ûrlapmezõ milyen karaktereket tartalmaz. Az
elsõ példában azok a kitöltések lesznek
helyesek, amelyek csak pozitív egész számokat tartalmaznak.
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!-- A JavaScript kód elrejtése
function uresCheck(mezo){
if (mezo.value != "") return true;
else{
alert("Üres mezõ!");
return false;
}
}
function teszt(adat,minta){
for (var i=0; i<adat.length; i++)
if (minta.indexOf(adat.charAt(i)) == -1)
return false;
return true;
}
function numerikusCheck(mezo){
if (!uresCheck(mezo)) return false;
if (!teszt(mezo.value,"1234567890")){
alert("Ez nem numerikus érték!");
return false;
}
else{
alert("Ez helyes érték!");
return true;
}
}
// -->
</SCRIPT>
</HEAD>
<BODY>
<P>
<FORM NAME="form_numerikus">
<INPUT TYPE="text" NAME="numerikus" SIZE="20">
<INPUT TYPE="button" VALUE="Ellenõrizd"
onClick="numerikusCheck(form_numerikus.numerikus)">
</FORM>
</BODY>
</HTML>
Az ellenõrzést a numerikusCheck() függvény
végzi. Paramétere a vizsgált ûrlapmezõ. A
függvény elõször meghívja a már
korábban bemutatott uresCheck() függvényt. Ha ez hamis
értéket ad vissza (azaz üres volt a mezõnk), akkor az
if (!uresCheck(mezo)) return false;
utasítás igaz lesz, és a függvény hamis
értékkel tér vissza. Ellenkezõ esetben egy
feltételes elágazás következik. Itt kap szerepet a
teszt() függvény. Ez a függvény azt teszteli,
hogy a paraméterként átadott adat minden karaktere
szerepel-e a szintén paraméterként átadott
minta sztringben. A vizsgálat egy for ciklussal
történik, amely az adat összes betûjére
lefut, közben azt vizsgáljuk, hogy az aktuális betût
tartalmazza-e a minta.
if (minta.indexOf(adat.charAt(i)) == -1) return false;
Az adat.charAt(i) az adat sztring i-edik karakterét adja
vissza. Az indexOf() függvény pedig megadja, hogy ez a
karakter hányadik a mintában. Ha nem szerepel benne, akkor -1
értéket ad. Ekkor a feltétel igaz lesz, és a
teszt() függvény hamis értékkel tér
vissza. Mivel a minta sztring példánkban csak számokat
tartalmazott ("1234567890"), ezért a teszt
függvény hamis értéket ad minden olyan
adatra, amely nem pozitív egész szám. Ekkor a
if (!teszt(mezo.value,"1234567890")){...}
feltétel igaz lesz, és a numerikusCheck()
függvény hibaüzenetet jelenít meg, és hamis
értéket ad vissza.
A teszt() függvény jól használható
olyan sztringek ellenõrzésére, amelyek csak
meghatározott karaktereket tartalmaznak. Tegyük fel, hogy a
következõ mezõbe egy telefonszámot kell írni.
Ez több módon is megadható. Szerepelhetnek benne
szóközök, kötõjelek, zárójelek (),
számok 0-tól 9-ig és / jel, a mellék
megadásához. Az alábbi megadások
például mind helyesek:
123 456
123-456
(1)123-456
(1)123-456 /123
A program a következõ:
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!-- A JavaScript kód elrejtése
function uresCheck(mezo){
if (mezo.value != "") return true;
else{
alert("Üres mezõ!");
return false;
}
}
function teszt(adat,minta){
for (var i=0; i<adat.length; i++)
if (minta.indexOf(adat.charAt(i)) == -1)
return false;
return true;
}
function tartalmaz(adat,minta){
for (var i=0; i<adat.length; i++)
if (minta.indexOf(adat.charAt(i)) != -1)
return true;
return false;
}
function telefonCheck(mezo){
if (!uresCheck(mezo)) return false;
if (!teszt(mezo.value,"1234567890()/- ") ||
!tartalmaz(mezo.value,"1234567890")){
alert("Ez nem jó telefonszám!");
return false;
}
else{
alert("Ez helyes telefonszámnak tûnik!");
return true;
}
}
// -->
</SCRIPT>
</HEAD>
<BODY>
<P>
<FORM NAME="form_telefon">
<INPUT TYPE="text" NAME="telefon" SIZE="20">
<INPUT TYPE="button" VALUE="Ellenõrizd"
onClick="telefonCheck(form_telefon.telefon)">
</FORM>
</BODY>
</HTML>
Az egyetlen újdonság a tartalmaz() függvény,
ami a teszt() egy változataként fogható fel.
Hasonló a felépítése is, de ez a
függvény akkor ad hamis értéket, ha a
paraméterként átadott adat egyetlen karaktere sincs
benne a minta sztringben. Ez alapján az ellenõrzést
végzõ telefonCheck() úgy mûködik, hogy
az uresCheck() függvénnyel ellenõrizzük, nem
üres-e az ûrlapmezõnk, majd a
if (!teszt(mezo.value,"1234567890()/- ") ||
!tartalmaz(mezo.value,"1234567890"))
feltétel akkor lesz igaz, ha vagy a teszt(), vagy a
tartalmaz() függvény hamis értéket ad vissza.
Ekkor rossz telefonszámot írtunk be, amire hibaüzenet
figyelmeztet bennünket és a függvény hamis
értéket ad vissza.
Fókusz állítása ûrlapmezõkre
Az ûrlapmezõknek (sõt a kereteknek is) létezik egy
olyan focus() nevû metódusa, ami
ráállítja a fókuszt az adott elemre.
Segítségével meghatározható, hogy az oldal
betöltése után mely mezõ legyen aktív (a
<BODY> HTML elemben az onLoad eseménykezelõ
segítségével), de hasznos lehet akkor is, ha hiba
esetén a rosszul kitöltött mezõt tesszük
aktívvá, és így a felhasználó
könnyebben javíthatja azt. Ezen kívül a
szövegmezõknek létezik egy select() metódusa
is, amely kijelöli annak tartalmát. A következõ
példa ezek használatát mutatja be.
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!-- A JavaScript kód elrejtése
var aktualis = 0;
function fokusz_allitas(){
if (aktualis == 0){
document.select_form.text1.focus();
document.select_form.text1.select();
}
else{
document.select_form.text2.focus();
document.select_form.text2.select();
}
aktualis = 1 - aktualis;
}
// -->
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="select_form">
<INPUT TYPE="text" NAME="text1" VALUE="Az elsõ mezõ" SIZE="15"><BR>
<INPUT TYPE="text" NAME="text2" VALUE="A második mezõ" SIZE="15"><BR>
<INPUT TYPE="button" VALUE="Fókuszállítás" onClick="fokusz_allitas()">
</FORM>
</BODY>
</HTML>
A fokusz_allitas() függvény végzi a
fókuszálást illetve a mezõ tartalmának
kijelölését. Ezt az aktulis nevû
változó alapján teszi. Ha ez 0, akkor az elsõ
mezõt, ha 1, akkor a második mezõt teszi
aktuálissá.
Ûrlapok elküldése levélben
A fejezet bevezetésében már volt szó a CGI
programokról, amelyek a szerveren futva képesek feldolgozni az
ûrlapjainkat és rögtön válaszolni nekünk.
Azonban nem mindenki rendelkezik olyan lehetõséggel, hogy egy
szerver gépen CGI programot futtathasson. Nekik jól jöhet az
a lehetõség, hogy egy ûrlap tartalma levélben is
elküldhetõ. Persze ekkor a feldolgozás nem lesz automatikus,
de olyan esetekben, ahol nem fontos a gyors válasz küldése,
ott tökéletesen megfelel.
Valójában ez nem igényel egyetlen JavaScript
utasítást sem, hanem tisztán megoldható HTML
segítségével (IE 3.0 a tapasztalatok szerint nem
támogatja).
<FORM METHOD="post" ACTION="mailto:e-mail@cim" ENCTYPE="text/plain">
...
Itt az ûrlap mezõinek definiálása következik
...
</FORM>
Látható, hogy az ACTION attribútumnál nem egy
szerver címét adtuk meg, hanem e-mail címet. Erre a
címre küldjük ki az ûrlap tartalmát. Az ENCTYPE
attribútumnak a "text/plain" értéket adtuk, mert
ebben az esetben kódolatlanul, olvasható formában
továbbítódik a tartalom.
Végül egy összetettebb példán
nézzük át a tanultakat. Használjuk fel a
korábban bemutatott ellenõrzõ függvényeket! Ha
rosszul töltöttük ki az ûrlapot és úgy
kattintunk az elküld gombra, akkor figyelmeztetõ hibaüzenetet
kapunk. Az ûrlapot az általunk megadott címre
küldjük el, amit az utolsó mezõben adhatunk meg.
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!-- A JavaScript kód elrejtése
function uresCheck(mezo){
if (mezo.value != "") return true;
else{
alert("A(z) "+ mezo.name +" mezõ üres!");
return false;
}
}
function emailCheck(mezo){
var szoveg = mezo.value;
if (!(szoveg.indexOf('@')>0 && szoveg.indexOf('@')<szoveg.length-1)){
alert("Rossz e-mail cím!");
return false;
}
else return true;
}
function teszt(adat,minta){
for (var i=0; i<adat.length; i++)
if (minta.indexOf(adat.charAt(i)) == -1)
return false;
return true;
}
function numerikusCheck(mezo){
if (!uresCheck(mezo)) return false;
if (!teszt(mezo.value,"1234567890")){
alert("Ez nem numerikus érték!");
return false;
}
else return true;
}
function tartalmaz(adat,minta){
for (var i=0; i<adat.length; i++)
if (minta.indexOf(adat.charAt(i)) != -1)
return true;
return false;
}
function telefonCheck(mezo){
if (!uresCheck(mezo)) return false;
if (!teszt(mezo.value,"1234567890()/- ") ||
!tartalmaz(mezo.value,"1234567890")){
alert("Ez nem jó telefonszám!");
return false;
}
else return true;
}
function ellenoriz(){
if (uresCheck(document.form.nev) &&
numerikusCheck(document.form.ev) &&
telefonCheck(document.form.telefon) &&
emailCheck(document.form.email)){
document.form.action = "mailto:"+document.form.email.value;
return true;
}
else return false;
}
// -->
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="form" ACTION="dummy" ENCTYPE="text/plain"
onSubmit="return ellenoriz()">
Neved?<BR><INPUT TYPE="text" NAME="nev" SIZE="20">
<P>Hany eves vagy?
<BR><INPUT TYPE="text" NAME="ev" SIZE="20">
<P>Telefonszám ellenõrzése:
<BR><INPUT TYPE="text" NAME="telefon" SIZE="20">
<P>Az urlap a kovetkezo e-mail cimre lesz elkuldve...
<BR><INPUT TYPE="text" NAME="email" SIZE="20">
<P><INPUT TYPE="submit" NAME="submit" VALUE="Elküld">
</FORM>
</BODY>
</HTML>
A programban feltûnik több ismerõs,
ellenõrzéssel kapcsolatos függvény is. Ezeket picit
módosítottam. Már nem írják ki, ha egy
mezõ helyesen lett kitöltve, hiszen arra nincs
szükségünk, valamint az uresCheck() függvény
változott abban, hogy a hibaüzenetben kiírja annak a
mezõnek a nevét, amely üresen maradt az ûrlapelemek
name attribútumának felhasználásával.
Vegyük észre, hogy a <FORM> HTML elemen belül az
onSubmit eseménykezelõ meghívja az ellenoriz()
nevû függvényt.
<FORM NAME="form" ....... onSubmit="return ellenoriz()">
A Submit esemény akkor lép fel, amikor
elküldjük az ûrlapot. Az ellenoriz()
függvény igaz értéket ad vissza, ha az
ellenõrzést elvégzõ függvények igaz
értéket adnak vissza minden egyes mezõre. Csak ebben az
esetben történik meg a küldés. Az ellenoriz()
függvény állítja be az ACTION attribútumot is
a form.email mezõ tartalma alapján. Az ûrlap
tartalmát erre a címre küldjük el.
document.form.action = "mailto:"+document.form.email.value;
|