Javascript i sprawdzanie formularzy
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ć:
<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ć:
- 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),
- hasło: powinno to być sensowne hasło (klasa sane_password),
- 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:
simple_email: function() {
return (/^\w+@\w+(\.\w+)+\.?$/.test(this.value));
},
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:
- formularze zawierają informacje o danych w postaci zwięzłej i czytelnej i dla maszyny, i dla człowieka,
- 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,
- 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.


March 29th, 2007 12:42
ddd
September 28th, 2007 23:58
http://elksoft.pl/probne/validator/ - link mi nie działa
October 16th, 2007 16:03
Dziękuję za zwrócenie uwagi, już poprawiłem
December 29th, 2007 12:34
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?
December 29th, 2007 12:37
http://is3.e12.pl/java/
Tutaj jest niby identycznie i nie działa co robię źle ?
December 29th, 2007 23:05
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
December 30th, 2007 14:41
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?
January 3rd, 2008 12:27
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