Godzina 1: zdarzenie, addEventListener, obiekt zdarzenia
Godzina 2 (dziś): nie tylko klik - inne zdarzenia (keydown, submit)
Godzina 3: budujemy planszę 3×3 (kółko i krzyżyk)
Godzina 4: kliknięcie pola zapisuje ruch
Godzina 5: kto wygrał - sprawdzamy planszę
Rozgrzewka · 3 minuty
Rozgrzewka: zdarzenia z poprzedniej lekcji
Dlaczego addEventListener jest zalecany zamiast atrybutu onclick w HTML?
Jakie dwa argumenty przyjmuje metoda addEventListener?
Co wskazuje event.target wewnątrz funkcji obsługi zdarzenia?
Część 1 · Inne zdarzenia niż click
Nie tylko click: inne rodzaje zdarzeń
Na poprzedniej lekcji nasłuchiwaliście zdarzenia click - kliknięcia myszką. Przeglądarka wystrzeliwuje też inne zdarzenia: naciśnięcie klawisza, wysłanie formularza, koniec wczytywania strony. Każde nasłuchujecie tą samą metodą addEventListener, tylko z inną nazwą zdarzenia jako pierwszym argumentem.
MDN: Learn_web_development/Core/Scripting/Events, sekcja „What is an event?” („The user presses a key on the keyboard. […] A form is submitted. […] A web page finishes loading.”, tłum. własne: „Użytkownik naciska klawisz na klawiaturze. […] Formularz zostaje wysłany. […] Strona kończy się wczytywać.”); keydown: sekcja „Event objects” („the keydown event fires when the user presses a key”, tłum. własne: „zdarzenie keydown wystrzeliwuje, gdy użytkownik naciska klawisz”); submit: sekcja „Getting hands-on with events” („the submit event is fired on a form when it is submitted”, tłum. własne: „zdarzenie submit wystrzeliwuje na formularzu, gdy zostaje on wysłany”)
Część 2 · Formularz i zdarzenie submit
submit: zdarzenie wysłania formularza
Gdy wypełnicie formularz i klikniecie przycisk „Wyślij” (albo wciśniecie Enter w polu), przeglądarka domyślnie wysyła dane na serwer i przeładowuje stronę. Zdarzenie submit wystrzeliwuje dokładnie w tym momencie - zanim to się stanie, więc możecie jeszcze zareagować.
const form = document.getElementById("signup");
form.addEventListener("submit", handleSubmit);
MDN: Learn_web_development/Core/Scripting/Events, sekcja „Getting hands-on with events” („When you fill in the details and click the submit button, the natural behavior is for the data to be submitted to a specified page on the server for processing, and the browser to be redirected”, tłum. własne: „Gdy wypełnicie dane i klikniecie przycisk wysyłania, naturalnym zachowaniem jest wysłanie danych na wskazaną stronę na serwerze do przetworzenia, a przeglądarka zostaje przekierowana”)
Część 3 · Zatrzymujemy domyślne działanie
event.preventDefault(): zatrzymaj domyślne działanie przeglądarki
Obiekt zdarzenia event(poprzednia lekcja) ma metodę preventDefault(). Wywołana wewnątrz funkcji obsługi zatrzymuje to, co przeglądarka zrobiłaby domyślnie - tu: wysłanie formularza i przeładowanie strony. Reszta funkcji (np. komunikat o błędzie) wykonuje się dalej.
functionhandleSubmit(event) {
if (nameField.value === "") {
event.preventDefault();
// formularz nie zostanie wysłany
}
}
MDN, Web/API/Event/preventDefault: „The preventDefault() method of the Event interface tells the user agent that the event is being explicitly handled, so its default action […] should not be taken.” - „Metoda preventDefault() interfejsu Event mówi programowi klienckiemu (przeglądarce), że zdarzenie jest jawnie obsługiwane, więc jego domyślne działanie […] nie powinno zostać podjęte.” (tłum. własne)
Część 4 · Zdarzenie keydown i licznik
keydown: liczymy naciśnięcia klawiszy
Zdarzenie keydown wystrzeliwuje za każdym razem, gdy naciśniecie klawisz w polu, które ma fokus (jest aktywne). Licznik keyCount rośnie o 1 przy każdym naciśnięciu.
Ciekawostka z MDN: obok keydown istniało kiedyś zdarzenie keypress, uruchamiane tylko przy klawiszach, które wpisują znak - literach, cyfrach, Enterze. Strzałki i Escape go nie odpalały. MDN oznacza dziś keypress jako przestarzałe i każe używać w zamian keydown albo beforeinput.
MDN: Learn_web_development/Core/Scripting/Events, sekcja „Event objects” („the keydown event fires when the user presses a key. Its event object is a KeyboardEvent, which is a specialized Event object with a key property that tells you which key was pressed”, tłum. własne: „zdarzenie keydown wystrzeliwuje, gdy użytkownik naciska klawisz. Jego obiekt zdarzenia to KeyboardEvent, wyspecjalizowany obiekt Event z właściwością key, która mówi, jaki klawisz został naciśnięty”)
Sprawdź w przeglądarce: kliknij Wyślij z pustym polem (strona nie powinna się przeładować), potem wpisz imię i kliknij Wyślij ponownie (przeładowanie następuje).
Dla chętnych: zapisz zmiany w swoim repozytorium - commit „Dodaje walidację formularza przy submit”.
Na koniec
Sprawdź się
Jakie dwa zdarzenia inne niż click poznaliście dziś i kiedy każde z nich się zdarza?
Co robi event.preventDefault() wywołane w funkcji obsługi zdarzenia submit?
Co się stanie, jeśli w formularzu z ćwiczenia NIE wywołacie preventDefault(), gdy pole jest puste?
To tyle na dziś - kolejny temat: budujemy planszę 3×3.
Poza szkołą
A jak to wygląda w produkcji?
Na lekcji
W produkcji
Status
Puste pole blokowane tylko w JavaScript
Atrybut HTML required blokuje wysłanie bez JS, a serwer i tak sprawdza dane jeszcze raz - JavaScript w przeglądarce da się wyłączyć
rozszerzane
Ręczny if sprawdzający jedno pole
Biblioteki formularzy (np. React Hook Form) same zbierają błędy wielu pól i pokazują komunikaty
zastępowane
keydown do liczenia naciśnięć
Do śledzenia bieżącej wartości pola częściej używa się zdarzenia input - reaguje też na wklejenie i autouzupełnianie, nie tylko na klawisz
zastępowane (dla wartości pola)
Zdarzenie load na całym dokumencie
Kod, który nie potrzebuje obrazów, częściej czeka na DOMContentLoaded - odpala się szybciej, bo nie czeka na wczytanie grafik