strona główna

Javascript i sprawdzanie formularzy

http://blog.elksoft.pl/wp-content/b10mechanics030_small.jpg

Niedawno znalezione: wygodna biblioteka ułatwiająca sprawdzanie poprawności danych wpisanych w formularzu, jeszcze przed wysłaniem ich do serwera. Samo sprawdzanie to nic nowego, ale tę bibliotekę spośród innych rozwiązań wyróżnia sposób, w jaki określa się poprawną zawartość: poprzez atrybut class pól formularzy i odpowiednio zdefiniowane, ogólne funkcje testujące.

Łatwiej to zademonstrować niż opowiedzieć:

<form>
<ul>
<li>Adres: <input name="email" type="text" class="simple_email"/></li>
<li>Hasło: <input name="password" type="password" class="sane_password"/></li>
<li>Używane shelle:
<select name="shell" multiple="1" class="mandatory">
<option value="bash">/bin/bash</option>
<option value="ash">/bin/ash</option>
<option value="csh">/bin/csh</option>
<option value="emacs">/usr/bin/emacs</option>
</select>
</ul>
<button type="submit" name="commit">Dodaj</button></td>
</form>

Ten fragment tworzy formularz z trzema polami: miejscem na email, hasło oraz listę używanych programów. Każde z nich ma przypisaną klasę, która określa jaką zawartość należy wymuszać:

  1. email: chciałbym, żeby można było wpisać adres email w najczęściej używanej, prostej postaci – użytkownik@domena.gdzieśtam (klasa simple_email),
  2. hasło: powinno to być sensowne hasło (klasa sane_password),
  3. używane shelle: należy wybrać przynajmniej jeden (klasa mandatory).

Jak widać, formularz pomimo dodania tej informacji nadal jest prosty i czytelny. Pozostaje jeszcze zdefiniować funkcje sprawdzające poprawność pól:

var Validators = {
simple_email: function() {
return (/^\w+@\w+(\.\w+)+\.?$/.test(this.value));
},
sane_password: function() {
return this.value.length > 3;
}
};

Klasa mandatory już jest zdefiniowana w bibliotece, więc nie trzeba jej dodawać. Funkcje te mogą być wspólne dla wielu formularzy, więc najlepiej umieścić je w osobnym pliku .js, wspólnym dla całego serwisu. Zostało już tylko włączenie sprawdzania formularzy poprzez wykonanie po załadowaniu strony:

Form.Validator.installForAllForms({'validators':Validators});

I już, efekt można obejrzeć tutaj. Jakie dokładnie są zalety takiego podejścia? Po kolei:

  1. formularze zawierają informacje o danych w postaci zwięzłej i czytelnej i dla maszyny, i dla człowieka,
  2. definicje funkcji testowych są zebrane w jednym, wspólnym dla całego serwisu miejscu, co oznacza że ewentualna zmiana sane_password dla wszystkich formularzy na coś bardziej skomplikowanego będzie szybka i wygodna,
  3. to, co trzeba napisać samemu, zostało ograniczone do naprawdę niezbędnego minimum: biblioteka faktycznie zawiera całą wspólną część kodu.

Uwaga, na wszelki wypadek: całe to sprawdzanie po stronie klienta oczywiście nie oznacza, że można zrezygnować z kontroli danych na serwerze. Nie należy mieć zaufania do przeglądarki. I nie o to tu chodzi, żeby całkowicie przenieść testy na klienta, tylko o szybsze poinformowanie użytkownika że coś wpisał źle.

Rozwiązanie ma jedną wadę: poprawność trzeba sprawdzać w dwóch miejscach, najprawdopodobniej w dwóch różnych językach programowania (ktoś tu pisze kod po stronie serwera w JS?), co oznacza powtarzanie informacji. Trzeba będzie się przyjrzeć, czy w takim Django dałoby się wyznaczać tablicę Validators na podstawie definicji modelu :)

Aktualizacja 2007/10/16: Miron zwrócił uwagę, że nie działał odsyłacz do strony testowej. Poprawiłem, dzięki.

Przy okazji wprowadziłem jedną zmianę, drobną ale ważną: od teraz pola z niepoprawną zawartością są wskazywane kolorem tła. Form.Validator ustawia takim elementom klasę "invalid", więc wymagało to tylko dopisania jednej linii CSS.

O autorze: nazywam się Marcin Kaszyński i od ponad 10 lat zajmuję się tworzeniem oprogramowania, od projektowania przez programowanie do zarządzania projektami włącznie. Prowadzę warsztaty Django, będące szybkim i łatwym sposobem na poznanie tego środowiska i rozpoczęcie pracy z pełnym wykorzystaniem jego możliwości.

8 Responses to “Javascript i sprawdzanie formularzy”

  1. Anonymous
    March 29th, 2007 12:42
    1

    ddd

  2. Miron
    September 28th, 2007 23:58
    2

    http://elksoft.pl/probne/validator/ - link mi nie działa :(

  3. marcink
    October 16th, 2007 16:03
    3

    Dziękuję za zwrócenie uwagi, już poprawiłem :)

  4. Manfri
    December 29th, 2007 12:34
    4

    Próbuje sobie testowo skopiować ten skrypt, ale coś mi nie działa, mam plik html i wszystkie *.js , czy jeszcze jest potrzebny osobny plik css?, żeby się pola kolorowały?

  5. Manfri
    December 29th, 2007 12:37
    5

    http://is3.e12.pl/java/

    Tutaj jest niby identycznie i nie działa co robię źle ? :(

  6. marcink
    December 29th, 2007 23:05
    6

    Manfri: najwyraźniej nie jest identycznie.

    Na pierwszy rzut oka — nie zainstalowałeś validators, a to oznacza że nie włączyłeś sprawdzania. Nie widzę też definicji css, która kolorowałaby źle wypełnione pola.

    Ogólnie: masz krótki przykład który działa. Masz swoją stronę która robi prawie to samo, ale nie działa. Teraz wystarczy znaleźć różnice. Powodzenia :)

  7. Manfri
    December 30th, 2007 14:41
    7

    Zrobiłem, teraz chciałem się zapytać gdzie mogę znaleźć komendy do walidacji ? np sprawdzenie czy w danym polu są tylko cyfry. 2 podałeś w formularzu, ale one są stworzone przez Ciebie ? i nie odwołują się do plików js?

  8. marcink
    January 3rd, 2008 12:27
    8

    Manfri: trochę przykładowych funkcji sprawdzających poprawność jest na stronie biblioteki, plik validators.js: http://www.schuerig.de/michael/javascript/validators.js

    A testy typu „pole zawiera tylko cyfry” są proste, poczytaj o używaniu wyrażeń regularnych. Jeśli jeszcze nie znasz, a chcesz pisać cokolwiek związanego z WWW, to to będzie bardzo dobra inwestycja czasu :)

Dodaj komentarz