onclick
Uruchamia kod JavaScript po kliknięciu elementu. Najprostszy, ale nie najlepszy sposób obsługi zdarzeń.
- Dotyczy
- Wszystkie elementy HTML
Przykład
#<button type="button" onclick="this.textContent = 'Zapisano na kurs'; this.disabled = true">
Zapisz się na kurs HTML
</button>
<p>Kursy w koszyku: <strong id="cart">0</strong></p>
<button type="button" onclick="
const cart = document.getElementById('cart');
cart.textContent = Number(cart.textContent) + 1;
">Dodaj kurs do koszyka</button>W pierwszym przycisku this wskazuje sam przycisk, więc kod zmienia jego napis i go wyłącza. Drugi przycisk znajduje licznik po id i zwiększa go przy każdym kliknięciu. Przejdź do przycisków klawiszem Tab i naciśnij Enter: to też jest kliknięcie.
Definicja i zastosowanie
#Atrybut onclick zawiera kod JavaScript, który przeglądarka wykona po kliknięciu elementu. Zdarzenie click zachodzi nie tylko po kliknięciu myszą czy dotknięciu ekranu: przycisk wywołuje je też po naciśnięciu Enter lub Spacji, a link po naciśnięciu Enter. Na elemencie <button> obsłużysz więc jednym atrybutem mysz, dotyk i klawiaturę.
Przeglądarka opakowuje kod z atrybutu w funkcję z parametrem event. W środku masz więc do dyspozycji this, czyli element, na którym stoi atrybut, oraz event, czyli obiekt zdarzenia. event.target wskazuje element, w który faktycznie kliknięto. Może to być dziecko elementu z atrybutem, bo kliknięcie wędruje w górę drzewa (bubbling). Zwrócenie false anuluje domyślną akcję, tak samo jak event.preventDefault().
Atrybuty zdarzeń są wygodne w krótkich przykładach, ale w prawdziwych projektach lepiej używać w skrypcie metody addEventListener. HTML zostaje wtedy czysty, jeden element może mieć kilka funkcji obsługi, a strona działa także z restrykcyjną polityką bezpieczeństwa treści (CSP), która blokuje kod wpisany w atrybuty. Atrybut widzi przy tym tylko funkcje globalne, więc funkcji zadeklarowanej w <script type="module"> z niego nie wywołasz.
Uważaj też na nietypowy sposób wyszukiwania nazw. W kodzie atrybutu przeglądarka sprawdza najpierw właściwości samego elementu, potem formularza, do którego element należy, potem obiektu document, a dopiero na końcu zmienne globalne. Dlatego Twoja funkcja open() albo clear() wywołana z atrybutu się nie uruchomi. Zamiast niej zadziała document.open(), które czyści całą stronę, albo document.clear(), które nic nie robi.
Składnia
#<element onclick="kod JavaScript">…</element>Dostępne w kodzie atrybutu
#this
Element, na którym stoi atrybut. Przezthiszmienisz jego tekst, klasy albo atrybuty.event
Obiekt zdarzenia. Przy kliknięciu zawiera m.in. położenie kursora (clientX,clientY) i informację, czy wciśnięto Shift albo Ctrl (shiftKey,ctrlKey).event.target
Element, w który faktycznie kliknięto. Może to być dziecko elementu z atrybutem.event.preventDefault()
Anuluje domyślną akcję, np. przejście pod adres linku albo zaznaczenie pola wyboru.return false
W atrybucie działa jakevent.preventDefault(). W funkcji dodanej przezaddEventListenernie ma takiego efektu.
Więcej przykładów
#<ul onclick="
document.getElementById('log').textContent =
'this: ' + this.tagName + ', event.target: ' + event.target.tagName;
">
<li>Lekcja 1: <strong>znaczniki</strong></li>
<li>Lekcja 2: <em>atrybuty</em></li>
</ul>
<p id="log">Kliknij w listę, najlepiej w pogrubione albo pochylone słowo.</p>Atrybut stoi na liście <ul>, więc this zawsze wskazuje listę. event.target to element, w który trafił kursor: LI, STRONG, EM, a czasem sama lista. Na tym opiera się delegowanie zdarzeń, czyli jedna funkcja obsługi dla wielu elementów.
<button type="button" id="enroll">Zapisz się na kurs HTML</button>
<script>
const button = document.getElementById('enroll');
button.addEventListener('click', (event) => {
event.currentTarget.textContent = 'Zapisano na kurs';
event.currentTarget.disabled = true;
});
</script>Tak obsługuje się zdarzenia w prawdziwych projektach. W funkcji strzałkowej this nie wskazuje elementu, dlatego zamiast niego używasz event.currentTarget.
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
#- Klikalny ma być
<button>albo<a>, a nie<div>z atrybutemonclick. Na<div>nie przejdziesz klawiszem Tab, a czytnik ekranu nie powie, że da się go kliknąć. - W React zapis
onClick={handleClick}tylko przypomina atrybut HTML. Przekazujesz w nim funkcję, a nie tekst z kodem, i to React dodaje nasłuchiwanie zdarzenia. - Nie wpisuj w atrybut długiego kodu. Jeśli potrzebujesz więcej niż jednej, dwóch instrukcji, przenieś go do funkcji w skrypcie, a najlepiej od razu do
addEventListener.
Powiązane hasła
#- <button>Klikalny przycisk: wysyła formularz, czyści go albo uruchamia akcję na stronie.
- <script>Osadza kod JavaScript w stronie albo wczytuje go z pliku, żeby dodać stronie zachowanie.
- onkeydownUruchamia kod JavaScript w chwili naciśnięcia klawisza. Służy do skrótów klawiszowych i obsługi klawiszy takich jak Enter czy Escape.
- onsubmitUruchamia kod JavaScript tuż przed wysłaniem formularza. Pozwala zatrzymać wysyłkę i obsłużyć dane w skrypcie.
- roleRola ARIA mówi czytnikom ekranu, czym jest element: przyciskiem, zakładką, komunikatem, nawigacją.
Widzisz błąd albo brakuje przykładu? Napisz do nas.