reportValidity i setCustomValidity
Wywoływanie interfejsu walidacji przeglądarki i ustawianie niestandardowych komunikatów błędów
reportValidity i setCustomValidity to bezpłatna lekcja HTML Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej HTML Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs HTML Academy zawiera 4 lekcji w sumie.
Dwa interfejsy API dla wbudowanego UX
Constraint Validation API udostępnia dwie metody sterujące wbudowanym interfejsem walidacji przeglądarki: reportValidity (wyświetla podpowiedź) oraz setCustomValidity (ustawia niestandardowy komunikat o błędzie). Razem pozwalają dostosować komunikaty, zachowując natywny sposób ich prezentacji.
reportValidity a checkValidity
checkValidity() po cichu zwraca true/false — bez efektów ubocznych w interfejsie. reportValidity() wykonuje to samo sprawdzenie, ale dodatkowo ustawia fokus na pierwszym nieprawidłowym polu i wyświetla podpowiedź walidacyjną przeglądarki. Należy wybrać reportValidity, gdy chcą Państwo bez dodatkowej pracy korzystać z natywnego UX.
document.forms.signup.addEventListener("submit", (e) => {
if (!e.target.reportValidity()) {
e.preventDefault();
// browser already focused first invalid field and showed tooltip
}
});Walidacja programowa
W wieloetapowych formularzach należy sprawdzać pola danego kroku przed przejściem dalej: if (step.reportValidity()) { next(); }. Przeglądarka zajmuje się wyświetlaniem błędów, a fokus użytkownika trafia na pole wymagające uwagi — nie trzeba ponownie implementować zarządzania fokusem.
setCustomValidity zastępuje komunikaty
Domyślne komunikaty ("Please fill out this field") mogą nie pasować do przyjętego tonu. input.setCustomValidity("Username is required") zastępuje domyślny komunikat własnym tekstem. Pole jest traktowane jako nieprawidłowe, dopóki komunikat nie zostanie wyczyszczony.
Czyszczenie niestandardowych komunikatów
input.setCustomValidity("") usuwa niestandardowy komunikat i ponownie włącza zwykłą walidację. Należy wywoływać tę metodę przy każdej ponownej walidacji, ponieważ w przeciwnym razie nieaktualne komunikaty niestandardowe pozostaną nawet po naprawieniu problemu przez użytkownika.
input.addEventListener("input", () => {
if (input.value.length < 3) {
input.setCustomValidity("Must be at least 3 characters");
} else {
input.setCustomValidity("");
}
});Walidacja asynchroniczna
W przypadku kontroli po stronie serwera (np. unikatowości nazwy użytkownika lub ważności kuponu) należy użyć setCustomValidity po otrzymaniu odpowiedzi asynchronicznej: const ok = await checkUsername(value); input.setCustomValidity(ok ? "" : "Already taken");. Przeglądarka natychmiast uwzględni nowy stan walidacji.
Łączenie z niestandardowym interfejsem błędów
Aby używać własnego sposobu wyświetlania błędów i jednocześnie korzystać ze śledzenia stanu walidacji, należy nasłuchiwać zdarzenia invalid i wywołać e.preventDefault(), aby wyłączyć natywną podpowiedź: input.addEventListener("invalid", (e) => { e.preventDefault(); showError(input, input.validationMessage); }).
Wiele niestandardowych ograniczeń
setCustomValidity obsługuje jednocześnie tylko jeden niestandardowy komunikat. Aby wymusić kilka reguł, należy sprawdzić każdą z nich i wywołać setCustomValidity z najbardziej istotnym komunikatem, zgodnie z ustaloną kolejnością. Wyświetlona zostanie informacja o pierwszej niespełnionej regule.
Nie dubluj walidacji wbudowanej
Jeśli ustawią Państwo niestandardowy komunikat dla pustego wymaganego pola, Państwa komunikat i domyślny komunikat mogą się wzajemnie nakładać. Należy wybrać jedno podejście dla każdego pola: wyłączyć wbudowane ograniczenie (użyć type="text" zamiast type="email" i przeprowadzać walidację za pomocą setCustomValidity) albo w pełni zaufać walidacji wbudowanej.
Niestandardowa walidacja na poziomie formularza
W przypadku walidacji zależnej od wielu pól (np. zgodności potwierdzenia hasła z hasłem) należy zastosować setCustomValidity do powiązanego pola: confirmInput.setCustomValidity(confirmInput.value === passInput.value ? "" : "Passwords do not match"). Formularz pozostanie nieprawidłowy, dopóki obie wartości nie będą zgodne.
Internacjonalizacja
Wbudowane komunikaty są lokalizowane przez przeglądarkę na podstawie języka użytkownika. W przypadku niestandardowych komunikatów ustawianych za pomocą setCustomValidity trzeba samodzielnie zadbać o właściwy język — należy odczytać navigator.language lub własny stan i18n, a następnie dostarczyć odpowiednie tłumaczenie.
Testowanie
Należy otworzyć DevTools i sprawdzić każdą ścieżkę prowadzącą do błędu: wysłanie pustego formularza, częściowe dane, niezgodność formatu oraz niepowodzenie operacji asynchronicznej. Trzeba zweryfikować, czy wyświetlany jest właściwy komunikat, czy naprawienie problemu go usuwa oraz czy wysłanie prawidłowego formularza przebiega pomyślnie. Przypadki brzegowe (wklejenie danych w nieprawidłowym formacie i autouzupełnianie przeglądarki) wymagają osobnych testów.
Sprawdzenie wiedzy
Po wywołaniu input.setCustomValidity("Already taken") jak poinformować przeglądarkę, że pole znów jest prawidłowe?
Podsumowanie
reportValidity uruchamia wbudowany interfejs walidacji przeglądarki (fokus i podpowiedź), dzięki czemu świetnie nadaje się do programowych kontroli. setCustomValidity zastępuje domyślne komunikaty własnym tekstem — po ponownym uzyskaniu prawidłowości należy wyczyścić komunikat pustym ciągiem. Nasłuchiwanie zdarzenia invalid z użyciem preventDefault pozwala całkowicie przejąć wyświetlanie błędów. Mechanizmy te można stosować do walidacji zależnej od wielu pól, kontroli asynchronicznych i lokalizowanych komunikatów niestandardowych.
Często zadawane pytania
Czy lekcja „reportValidity i setCustomValidity” jest bezpłatna?
Tak — pełny tekst „reportValidity i setCustomValidity” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu HTML Academy, przejdź na CoddyKit PRO. Kurs HTML Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „reportValidity i setCustomValidity”?
Wywoływanie interfejsu walidacji przeglądarki i ustawianie niestandardowych komunikatów błędów Ćwiczysz HTML Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć HTML Academy?
Nie wymagamy żadnego doświadczenia. HTML Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „reportValidity i setCustomValidity”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji HTML Academy?
Tak. Każda lekcja HTML Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- FormData API
- Constraint Validation API
- reportValidity i setCustomValidity
- Zdarzenia resetowania formularza i zarządzanie stanem