Walidacja błędnych danych formularzy po stronie przeglądarki jest bardzo dobrym pomysłem, który zaoszczędza czas odwiedzających nasze strony. Przyjrzyjmy się, jak uzyskać tego typu efekt za pomocą JavaScriptu.
Przyjmijmy, że mamy formularz z polami na wpisanie nicka ({html}
{/html}) oraz treści – {html}
Pierwszym krokiem w tym celu będzie sprawdzenie, czy użytkownik uzupełnił każde wymagane pole. Jeśli jakiś element formularza będzie pusty, zablokujemy wysyłanie formularza i wyróżnimy czerwoną obwódką pole, w którym skrypt napotka błąd.
Dokument HTML
Stworzymy przykładowy dokument HTML, który
zobrazuje to zagadnienie – patrz listing 1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"pl-PL\">
<head>
<title>Strona z formularzem</title>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-2\" />
<style type=\"text/css\">
label {
display: block;
margin: 2px;
}
</style>
<!-- Nasz kod Javascript: -->
<script type=\"text/javascript\"></script>
</head>
<body>
<form method=\"post\" action name=\"dodawanie_posta\">
<label>Nick: <input type=\"text\" name=\"nick\" value /></label>
<label>Tresc <textarea name=\"content\" rows=\"5\" cols=\"20\"></textarea></label>
<input type=\"submit\" value=\"dodaj\" />
</form>
</body>
</html>
|
Jak widać na rysunku, nie ma tutaj żadnych udziwnień
- dwa pola, przycisk submit. Formularz jest
nazwany {stala}dodawanie_posta{/stala}.
{html}var formularz = document.forms['nazwa_formularza'];{/html}
Dzięki takiej konstrukcji możemy dostać się do określonego formularza i jego wszystkich elementów.
Pomiędzy nawiasami kwadratowymi wpisujemy wartość atrybutu name interesującego nas formularza.
Jak widać, mamy do czynienia z kolejnym przykładem rodzica i dziecka. Rodzicem jest cały dokument
HTML (document), a dzieckiem formularze (.forms).
Do określonego formularza możemy również dostać się wpisując w nawiasy kwadratowe numer porządkowy formularza. Jeśli formularz, który jest przedmiotem naszego zainteresowania, występuje
w dokumencie jako pierwszy, to możemy zastosować zapis {html}document.forms[0]{/html}. Użyliśmy zera, ponieważ w informatyce liczymy od zera.
Zdarzenie onsubmit
Chcemy sprawdzić, czy użytkownik wprowadził
poprawne dane po wciśnięciu przycisku submit. Oczywiście dysponując samym CSS-em
i HTML-em nie jesteśmy w stanie tego zrobić.
Z pomocą przychodzi kolejne zdarzenie Java-
Script. Wiemy już, jak wykryć czy użytkownik
naprowadził wskaźnik mysz na dany element
({stala}onmouseover{/stala}) lub czy go kliknął ({stala}onclick{/stala}). Podobnie
postąpimy z formularzem, a mianowicie
wychwycimy moment, kiedy użytkownik wyśle
formularz przyciskiem Dodaj. Pomoże w tym
zdarzenie{stala}onsubmit{/stala}.
Onsubmit to zdarzenie charakterystyczne dla
formularzy, które pozwala wykryć po stronie
przeglądarki moment, kiedy dany formularz
jest wysyłany.
Najpierw jednak zbudujmy funkcję {stala}Laduj{/stala}, która
po załadowaniu dokumentu sprawi, że nasz formularz
będzie miał ustawioną właściwość {stala}onsubmit{/stala},
odsyłającą do jakiejś funkcji, dajmy na to Verify.
1 2 3 4 5 6 7 8 |
<!-- Nasz kod Javascript: --> <script type=\"text/javascript\"> window.onload = Laduj; function Laduj() { } function Verify() { } </script> |
Nakazaliśmy, aby za każdym wywołaniem
strony na początku wykonała się funkcja {stala}Laduj{/stala}.
Musi ona dać znać formularzowi, że po jego
wysłaniu ma wykonać się funkcja Verify sprawdzająca
poprawność wpisanych danych. Problem
w tym, jak dostać się do formularza, kiedy nie
mamy jego id (wtedy użylibyśmy {html}document.getElementById(){/html}, ale tutaj, umyślnie, nie chcemy tego).
Na to też jest sposób!
Odnoszenie się do formularzy w JavaScript
Należy odwołać się do całego dokumentu i jego
potencjalnych dzieci. Jak pamiętamy, możliwe
było użycie: {stala}document.body{/stala}, więc dlaczego nie
wykorzystać podobnej konstrukcji w przypadku
formularzy?
1 2 3 |
function Laduj() { document.forms[\'dodawanie_posta\'].onsubmit = Verify; } |
W ten sposób zamiast używać identyfikatora
formularza, skorzystaliśmy z jego atrybutu name
o wartości dodawanie_posta.
Wracając do naszego przykładu, należy teraz
zdefiniować, za co odpowiedzialna będzie funkcja
Verify, która wywoływana jest po wciśnięciu
dodaj. Otóż najpierw powinna pobrać wartości
wszystkich pól.
Następnie musimy sprawdzić, czy
nie są one puste. Jeśli będzie inaczej, ustawiamy
{html}style.border = „2px solid #FF0000″;{/html} elementowi
formularza, który nie został wypełniony. Można
też wyświetlić okienko informacyjne alert();
o tym, że coś nie zostało wpisane.
1 2 3 4 5 |
function Verify() { var nick = document.forms [\'dodawanie_posta\'].nick.value; var content = document.forms [\'dodawanie_posta\'].content.value; var error = false; } |
Przeanalizujmy teraz kawałek, który będzie rozpoczynał
działanie funkcji. Zmienna nick pobiera
wartość pola input o {stala}name=”nick”{/stala}. Ze zmienną
content jest podobnie, tyle że jej wartość pobierana
jest z textarea o {stala}name=”content{/stala}”. Zmienna error
ma wartość false, co oznacza fałsz. Jej wartość
zostanie zmieniona na prawdę (true), kiedy nasz
skrypt napotka jakieś puste pole formularza.
Zmienna ta jest nam potrzebna, by określić, czy
trzeba zatrzymywać wysyłanie formularza, czy też
nie. Innymi słowy przechowuje ona informację
o napotkanych błędach. Równie dobrze można by
napisać: {html}var error = 0;{/html} i w razie błędu zmienić tę
wartość na 1. To bez znaczenia, choć pierwszy
sposób uczy dobrych, programistycznych nawyków.
Zostańmy więc przy tym.
Sprawdzenie danych użytkownika
Jeśli pobraliśmy już to, co użytkownik wpisał do
formularza, pora sprawdzić uzyskane wartości.
Zobaczmy, czy wartość pola nick jest pusta, czy
też nie:
1 2 3 4 5 |
if (nick == \"\") { document.forms[\'dodawanie_posta\']. nick.style.border = \"2px solid#FF0000\"; alert(\'Nie wypełniłeś pola z nickiem!\'); error = true; } |
Jak widać, konstrukcja if pozwala sprawdzić,
czy zmienna nick jest pusta. Świadczą o tym dwa
apostrofy. Jeśli chcemy osądzić, czy jakaś zmienna
jest pusta, to używamy do porównywania właśnie
apostrofów bez treści między nimi. Logiczne.
Konstrukcja ta pobiera wartość danego elementu formularza. Może to być {html}
{/html} czy też
{html}
.value to tylko jedna z możliwych opcji. W atrybutach elementów formularzy wpisujemy różne rzeczy,
np. w textarea może to być rows. Jeśli chcemy dobrać się do tej wartości, to analogicznie używamy
.rows:
{html}document.forms['name_formularza'].nazwa_elementu_formularza.rows{/html}
Jeśli warunek if będzie prawdziwy (czyli
użytkownik nie wpisze nic w pole nick), to wykonujemy
kod w klamrach. Jak wiadomo, odwołując
się do danego pola formularza, możemy
w łatwy sposób pobrać jego wiele właściwości,
w tym style. Korzystamy więc z tego
udogodnienia i zmieniamy border dla pola o {html}name=”nick” na „2px solid #FF0000″;{/html}.
W ten sposób pole to otrzyma czerwoną ramkę
świadczącą o błędzie. Następnie wyświetlamy
okienko alert, informujące nas o napotkanych
problemach. Kończymy, ustawiając wartość
zmiennej error na true, zaznaczając tym samym,
że wykryto błędy.
Podobnie sprawdzamy tekst wpisany w textarea
o nazwie content:
1 2 3 4 5 |
if (content == \"\") { document.forms[\'dodawanie_posta\'].content.style.border = \"2px solid #FF0000\"; alert(\'Nie wypełniłeś pola z treścią!\'); error = true; } |
Zwracanie wartości przez funkcje
Pozostaje tylko sprawdzić, czy podczas wykonywania
warunków if skrypt zasygnalizował błąd i potrzebne
jest zatrzymanie wysyłania formularza:
1 2 3 |
if (error) { return false; } |
W skrócie: jeśli zmienna error będzie prawdą
(czyli jej wartość będzie równa true), zwróć
(return) fałsz (false). Tym samym wszystkie
akcje zostaną zatrzymane, w tym wysyłanie
formularza. Gdybyśmy zwrócili true, przeglądarka
odebrałaby to tak, jakby wszystko poszło
dobrze.
Użycie tej konstrukcji powoduje zatrzymanie
wykonywania skryptu od momentu jej wystąpienia i jednoczesne zwrócenie wyników działania funkcji w postaci zdefiniowanej jako wartość. Słownie tłumaczymy to jak: zwróć wartość.
- return true; – w skrócie: zwróć prawdę
- return false; – w skrócie: zwróć nieprawdę
return używamy tylko w ciele funkcji!
Ostateczny rezultat
Rezultat naszej pracy widać na listingu 2.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"pl-PL\">
<head>
<title>Strona z formularzem</title>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-2\" />
<style type=\"text/css\">
label {
display: block;
margin: 2px;
}
</style>
<!-- Nasz kod Javascript: -->
<script type=\"text/javascript\">
window.onload = Laduj;
function Laduj(){
document.forms[\'dodawanie_posta\'].onsubmit = Verify;
}
function Verify(){
var nick = document.forms[\'dodawanie_posta\'].nick.value;
var content = document.forms[\'dodawanie_posta\'].content.value;
var error = false;
if (nick == \"\") {
document.forms[\'dodawanie_posta\'].nick.style.border = \"2px solid #FF0000\";
alert(\'Nie wypełniłeś pola z nickiem!\');
error = true;
}
if (content == \"\") {
document.forms[\'dodawanie_posta\'].content.style.border = \"2px solid #FF0000\";
alert(\'Nie wypełniłeś pola z treścią!\');
error = true;
}
if (error) {
return false;
}
}
</script>
</head>
<body>
<form method=\"post\" action name=\"dodawanie_posta\">
<label>Nick: <input type=\"text\" name=\"nick\" value /></label>
<label>Tresc <textarea name=\"content\" rows=\"5\" cols=\"20\"></textarea></label>
<input type=\"submit\" value=\"dodaj\" />
</form>
</body>
</html>
|
Warto jeszcze przyjrzeć się wartościom true i false:
1 2 3 4 5 6 7 8 |
var a = true; var b = false; if (a) { alert(\"tak, to prawda\"); } if(!b) { alert(\"nie, to nie jest prawda\"); } |
- var a = true; – wartość zmiennej a to true, czyli prawda,
- var b = false; – wartość zmiennej b to false, czyli fałsz,
- if (a) – jeśli zmienna a ma wartość true,
- if (!b) – jeśli zmienna b ma wartość false.
Wykrzyknik to tutaj zaprzeczenie. Jeśli więc
zmienna b nie będzie prawdą, to wykona się
kod w klamrach. Równie dobrze można to zapisać
tak:
1 2 3 4 5 6 7 8 |
var a = true; var b = false; if (a == true) { alert(\"tak, to prawda\"); } if(b == false) { alert(\"nie, to nie jest prawda\"); } |
Co do niezwykłej właściwości return, spójrzmy
na ten przykład:
1 2 3 4 5 6 |
function Blabla() { alert(\'1\'); return false; alert(\'2\'); } Blabla(); |
Definiujemy najpierw funkcję o nazwie Blabla,
która pokaże okienko o treści 1. Dalej niestety
nic się nie stanie, bowiem return false; zatrzymuje
działanie funkcji. Tak więc działania {stala}alert(’2′);{/stala}
nie ujrzymy.
Nie tylko zmienna może zwracać wartości false
lub true. Może to również robić zwykła funkcja:
1 2 3 4 5 6 7 8 9 |
function Blabla() { return false; } function Lalala() { if (!Blabla()) { alert(\'Funkcja Blabla zwróciła nieprawdę!\'); } } Lalala(); |
Wywołujemy {stala}(Lalala();){/stala}, jak widać, funkcję Lalala.
Ta z kolei bada {html}(if (!Blabla())){/html}, czy funkcja
Blabla zwraca fałsz. I rzeczywiście zwraca, bo
w jej ciele zapisaliśmy return false;. W tej sytuacji
wykonuje się kod w klamrach, czyli {stala}alert();{/stala}. Co
więcej, możemy przypisać zwracaną wartość funkcji
do zmiennej:
1 2 3 4 5 6 7 8 9 10 |
function Blabla() { return false; } function Lalala() { var zmienna = Blabla(); if (!zmienna) { alert(\'Funkcja Blabla zwróciła nieprawdę!\'); } } Lalala(); |
W ten sposób do zmiennej o nazwie zmienna
przypisaliśmy zwracaną wartość funkcji Blabla.
Dalej podstawiamy ją do if.
Jak na razie walidacja formularza jest mało efektywna.
Obramowanie inputów zostaje niezmiennie
kolorowe, mimo braku błędów. Tym problemem
zajmiemy się w następnym odcinku.
Może Cię zainteresować:





