JavaScriptDOM i zdarzenia

Event.preventDefault()

Blokuje domyślne działanie przeglądarki dla zdarzenia, np. wysłanie formularza lub przejście pod adres linku.

Zwraca
undefined
Na tej stronie

Przykład

#
JavaScript
const form = document.querySelector('#login')

form.addEventListener('submit', (event) => {
  event.preventDefault()
  const data = new FormData(form)
  console.log('Wysyłam przez fetch:', data.get('email'))
  console.log('Strona nie przeładuje się:', event.defaultPrevented)
})

form.requestSubmit()
Konsola
Wysyłam przez fetch: ania@example.com
Strona nie przeładuje się: true

Ostatni wiersz wysyła formularz z poziomu kodu, żeby wynik pojawił się od razu. Kliknięcie przycisku w podglądzie działa tak samo.

Definicja i zastosowanie

#

Wiele zdarzeń ma domyślną reakcję przeglądarki: kliknięcie w link otwiera nowy adres, wysłanie formularza przeładowuje stronę, a kliknięcie w pole wyboru zmienia jego stan. Wywołanie event.preventDefault() w funkcji obsługi blokuje tę reakcję, dzięki czemu możesz obsłużyć sytuację po swojemu.

Najczęstszy przykład to formularz: blokujesz przeładowanie strony, sprawdzasz dane i wysyłasz je przez fetch(). Właściwość event.defaultPrevented pozwala sprawdzić, czy domyślne działanie zostało już zablokowane.

preventDefault() nie zatrzymuje przekazywania zdarzenia do elementów nadrzędnych, do tego służy stopPropagation(). Nie zadziała też w obsłudze dodanej z opcją passive: true ani dla zdarzeń, których nie da się anulować (wtedy event.cancelable ma wartość false).

Składnia

#
Składnia
event.preventDefault()

Więcej przykładów

#
Link obsłużony przez JavaScript
JavaScript
const more = document.querySelector('#more')

more.addEventListener('click', (event) => {
  event.preventDefault()
  console.log('Ładuję kolejne kursy bez przechodzenia na inną stronę')
})

more.click()
Konsola
Ładuję kolejne kursy bez przechodzenia na inną stronę
Zablokowane pole wyboru
JavaScript
const terms = document.querySelector('#terms')

terms.addEventListener('click', (event) => {
  event.preventDefault()
  console.log('Najpierw przeczytaj regulamin')
})

terms.click()
console.log(terms.checked)
Konsola
Najpierw przeczytaj regulamin
false

Obsługa przeglądarek

#

Szeroko dostępne

Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.

  • Chrome
  • Edge
  • Firefox
  • Safari

Dobre praktyki

#
  • W obsłudze formularza wywołuj preventDefault() na samym początku funkcji. Jeśli dalej wystąpi błąd, strona i tak się nie przeładuje.
  • Nie blokuj domyślnego działania bez potrzeby. Linki i przyciski powinny zachowywać się tak, jak oczekuje użytkownik, także przy obsłudze klawiaturą.
  • Do zatrzymania przekazywania zdarzenia w górę, do rodziców, służy stopPropagation(), a nie preventDefault().

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.