Materiał edukacyjny · Informatyka JavaScript w przeglądarce · Moduł 08

MODUŁ 08

Walidacja formularzy i komunikaty błędów

PPrezentacja dla nauczyciela

Poprawne działanie aplikacji internetowej wymaga zabezpieczenia jej przed brakującymi lub błędnymi danymi. W tym module dowiesz się, jak sprawdzać wypełnienie pól, prezentować czytelne powiadomienia na stronie i w oknach alert oraz kontrolować moment wysyłki formularza.

Sprawdzanie obecności danych i pustych pól

Walidacja po stronie przeglądarki ma na celu natychmiastowe poinformowanie użytkownika o pominięciu wymaganych informacji lub wpisaniu nieprawidłowych wartości. Podstawową operacją jest weryfikacja, czy pole tekstowe nie pozostało puste.

Samo porównanie pole.value === '' bywa zawodne, gdy użytkownik wpisze do kontrolki same spacje. Aby zabezpieczyć skrypt przed takim przypadkiem, stosuje się metodę .trim(), która usuwa białe znaki z początku i końca łańcucha tekstowego: if (pole.value.trim() === '').

Weryfikacja może obejmować również minimalną liczbę znaków (właściwość pole.value.length), poprawność formatu lub sprawdzenie, czy wartość liczbowa mieści się w dopuszczalnym przedziale. Gdy którekolwiek kryterium nie jest spełnione, wyświetlamy stosowny komunikat błędu i przerywamy dalsze wykonywanie operacji.

Zanim porównamy długość lub format, warto oczyścić wpisany tekst. Metoda replaceAll(' ', '') usuwa wszystkie wystąpienia podanego fragmentu — także spacje w środku numeru — natomiast replace() usuwa tylko pierwsze. Dzięki temu numer zapisany jako 500 600 700 zamienia się w 500600700 i można sprawdzić, czy ma dokładnie 9 znaków:

const numer = pole.value.replaceAll(' ', '');

if (numer.length !== 9) {
  wynik.textContent = 'Numer musi zawierać dokładnie 9 cyfr!';
} else {
  wynik.textContent = 'Numer telefonu poprawny';
}
function walidujRejestracje() {
  const login = document.getElementById('poleLogin').value.trim();
  const haslo = document.getElementById('poleHaslo').value.trim();
  const komunikat = document.getElementById('komunikatWalidacji');

  if (login === '' || haslo === '') {
    komunikat.textContent = 'Błąd: Wszystkie pola są wymagane!';
    komunikat.className = 'blad';
    return;
  }

  if (haslo.length < 6) {
    komunikat.textContent = 'Błąd: Hasło musi mieć co najmniej 6 znaków!';
    komunikat.className = 'blad';
    return;
  }

  komunikat.textContent = 'Konto ' + login + ' zostało pomyślnie zarejestrowane.';
  komunikat.className = 'sukces';
}
1. Jaka metoda łańcucha znaków pozwala usunąć białe znaki z początku i końca tekstu przed sprawdzeniem, czy pole jest puste?
2. W jaki sposób najprościej sprawdzić w instrukcji warunkowej, czy pole hasło zawiera co najmniej 8 znaków?
3. Co zwróci wyrażenie pole.value === '' w sytuacji, gdy użytkownik wpisał w pole tekstowe wyłącznie spację bez użycia metody trim?

Komunikaty w oknie dialogowym i na stronie

Informacje o wyniku walidacji można przekazać użytkownikowi na dwa główne sposoby: za pośrednictwem systemowego okna dialogowego lub bezpośrednio w strukturze dokumentu HTML.

Funkcja alert(komunikat) otwiera modalne okienko z informacją tekstową i przyciskiem zatwierdzenia. Jest to najszybszy sposób zasygnalizowania błędu lub potwierdzenia akcji, jednak blokuje on dalszą interakcję ze stroną do momentu kliknięcia przycisku przez użytkownika.

Alternatywnym i bardzo elastycznym rozwiązaniem jest wpisanie komunikatu do dedykowanego elementu na stronie (np. akapitu <p id="komunikat">) za pomocą właściwości textContent. Możemy wówczas dynamicznie zmienić wygląd powiadomienia, nadając mu odpowiedni kolor za pomocą element.style.color = '#dc2626' lub przypisując klasę CSS, np. element.className = 'blad'.

function zatwierdzRezerwacje() {
  const klient = document.getElementById('imieKlienta').value.trim();
  const goscie = Number(document.getElementById('liczbaGosci').value);
  const potwierdzenie = document.getElementById('potwierdzenieRezerwacji');

  if (klient === '') {
    alert('Proszę podać imię i nazwisko osoby rezerwującej!');
    potwierdzenie.textContent = '';
    return;
  }

  if (goscie < 1 || goscie > 10) {
    alert('Liczba gości musi wynosić od 1 do 10 osób.');
    potwierdzenie.textContent = 'Błąd: nieprawidłowa liczba osób.';
    potwierdzenie.style.color = '#dc2626';
    return;
  }

  alert('Rezerwacja została pomyślnie przyjęta!');
  potwierdzenie.textContent = 'Zarezerwowano stolik dla ' + goscie + ' osób na nazwisko ' + klient + '.';
  potwierdzenie.style.color = '#16a34a';
}
4. Która funkcja języka JavaScript wyświetla proste modalne okno dialogowe z komunikatem i przyciskiem OK?
5. Jaka jest zaleta wyświetlania błędów walidacji w elemencie akapitu na stronie zamiast ciągłego używania alert?
6. W jaki sposób zmienić kolor tekstu komunikatu błędu na czerwony za pomocą JavaScript?

Obsługa formularza i blokowanie przeładowania

Domyślnym zachowaniem przeglądarki po naciśnięciu przycisku <button type="submit"> lub klawisza Enter w formularzu jest wysłanie danych pod adres określony w atrybucie action i odświeżenie strony. W przypadku aplikacji działających wyłącznie w przeglądarce przeładowanie to skasowałoby wprowadzone dane i wyświetlone wyniki.

Aby powstrzymać domyślną akcję wysyłki, podpinamy funkcję pod zdarzenie submit formularza i wywołujemy metodę event.preventDefault() na przekazanym obiekcie zdarzenia. Daje nam to pełną kontrolę nad procesem weryfikacji.

Jeżeli formularz przejdzie pomyślnie wszystkie etapy walidacji, możemy wyświetlić podsumowanie, a w razie potrzeby wyczyścić pola za pomocą wbudowanej metody formularz.reset().

const formularz = document.getElementById('formKontakt');

formularz.addEventListener('submit', function(event) {
  event.preventDefault();

  const email = document.getElementById('poleEmail').value.trim();
  const zgoda = document.getElementById('zgodaRegulamin').checked;
  const status = document.getElementById('statusFormularza');

  if (email === '' || !email.includes('@')) {
    status.textContent = 'Błąd: Wpisz prawidłowy adres e-mail ze znakiem @';
    status.style.color = '#dc2626';
    return;
  }

  if (!zgoda) {
    status.textContent = 'Błąd: Musisz zaakceptować regulamin serwisu.';
    status.style.color = '#dc2626';
    return;
  }

  status.textContent = 'Zgłoszenie z adresu ' + email + ' wysłane pomyślnie!';
  status.style.color = '#16a34a';
  formularz.reset();
});
7. Jakie domyślne zachowanie przeglądarki występuje po wywołaniu zdarzenia submit formularza?
8. Która metoda obiektu zdarzenia zatrzymuje domyślne przeładowanie strony po zatwierdzeniu formularza?
9. W którym miejscu funkcji walidującej należy umieścić instrukcję return, aby przerwać dalsze sprawdzanie po wykryciu błędu?

Ćwiczenia