Przejdź do treści

Temat 12 · 2 × 45 minINF.03

Zdarzenia myszy i klawiatury

W poprzedniej lekcji zmieniałeś stronę z kodu. Teraz nauczysz się robić to w odpowiedzi na użytkownika: kliknięcie, najechanie myszą, naciśnięcie klawisza, opuszczenie pola formularza. Każda taka sytuacja to zdarzenie (event), a funkcja, która na nie reaguje, to procedura obsługi (event handler, listener). We wszystkich 26 przeanalizowanych zadaniach praktycznych z JavaScriptem (INF.03 oraz starsze EE.09 i E.14) skrypt startował po kliknięciu, a w trzech pojawiły się też inne zdarzenia: blur i mouseover. Podstawa programowa nazywa to wprost: „stosuje w programowaniu obsługę zdarzeń myszy i klawiatury” (INF.03.5.3.2).

Jak działa zdarzenie

Przeglądarka nieustannie obserwuje stronę. Gdy coś się dzieje – użytkownik klika przycisk – tworzy obiekt zdarzenia i sprawdza, czy ktoś na ten typ zdarzenia na tym elemencie nasłuchuje. Jeśli tak, wywołuje jego funkcję. Trzy pojęcia:

  • cel (target) – element, na którym zaszło zdarzenie, np. <button id="oblicz">;
  • typ – click, keydown, mouseover… (w atrybutach HTML z przedrostkiem on: onclick);
  • procedura obsługi – twoja funkcja, uruchamiana przez przeglądarkę, nie przez ciebie.

Ostatni punkt jest kluczowy: ty tylko rejestrujesz funkcję. Wywołuje ją przeglądarka – za każdym razem, gdy zdarzenie zajdzie.

Trzy sposoby podpięcia funkcji

Trzy sposoby na to samo
function powitaj(sposob) {
  document.getElementById('wynik').textContent = 'Zadziałał sposób: ' + sposob;
}

// 2. właściwość elementu – przypisujesz FUNKCJĘ (bez nawiasów)
document.getElementById('b2').onclick = function () {
  powitaj('właściwość');
};

// 3. addEventListener – nazwa zdarzenia BEZ „on” + funkcja
document.getElementById('b3').addEventListener('click', () => {
  powitaj('addEventListener');
});
Podgląd
SposóbZapisZaletyWady
atrybut HTML (dialekt egzaminacyjny)<button onclick="oblicz()">widoczny w HTML, jedna linia, w każdej tabeli pomocniczej CKEmiesza HTML z JS, jedna funkcja na zdarzenie, kod w cudzysłowie
właściwość elementubtn.onclick = oblicz;prosty, czysty JStylko jedna funkcja – kolejne przypisanie nadpisuje poprzednie
addEventListenerbtn.addEventListener('click', oblicz);wiele funkcji, da się usunąć, dodatkowe opcje, standard w kodzie zawodowymnajdłuższy zapis

W atrybucie wpisujesz kod do wykonania, dlatego są tam nawiasy: onclick="oblicz()". W dwóch pozostałych sposobach przekazujesz samą funkcję, dlatego nawiasów nie ma. To najczęstszy błąd początkujących, więc zatrzymaj się tu na chwilę.

Sprawdź się

Co się stanie po załadowaniu strony i kliknięciu przycisku?

function pokaz() {
alert('Kliknięto!');
}
document.getElementById('btn').addEventListener('click', pokaz());

Obiekt zdarzenia: event

Przeglądarka przekazuje do twojej funkcji jeden argument – obiekt zdarzenia (zwykle nazywany event albo e). Zawiera wszystko o tym, co się stało.

Co wie obiekt zdarzenia
function wybierz(event) {
  console.log(event.type);                 // click
  console.log(event.target.tagName);       // BUTTON
  document.getElementById('info').textContent =
    'Wybrano: ' + event.target.textContent + ' (x=' + event.clientX + ')';
}

// jedna funkcja dla trzech przycisków – event.target mówi, który kliknięto
document.querySelectorAll('.opcja').forEach((btn) => btn.addEventListener('click', wybierz));
Podgląd

Najważniejsze pola:

Pole / metodaCo zawieraTyp zdarzeń
event.typenazwa zdarzenia: 'click', 'keydown'…wszystkie
event.targetelement, na którym zaszło zdarzeniewszystkie
event.currentTargetelement, na którym zarejestrowano funkcję (zwykle ten sam)wszystkie
event.keynaciśnięty klawisz jako napis: 'a', 'Enter', 'ArrowLeft', ' 'klawiatura
event.codefizyczny klawisz: 'KeyA', 'Enter', 'Space'klawiatura
event.clientX, event.clientYpozycja kursora w okniemysz
event.button0 lewy, 1 środkowy, 2 prawymysz
event.shiftKey, event.ctrlKey, event.altKeyczy trzymano modyfikatormysz i klawiatura
event.preventDefault()blokuje domyślną akcję (wysłanie formularza, przejście linku)wszystkie

W atrybucie onclick="…" masz dostęp do dwóch gotowych zmiennych: event (obiekt zdarzenia) i this (kliknięty element). Dlatego w gotowym kodzie często zobaczysz onclick="zmien(this)" – funkcja dostaje przycisk, który ją uruchomił.

this w atrybucie onclick
function zaznacz(klikniety) {
  const przyciski = document.getElementsByTagName('button');
  for (let i = 0; i < przyciski.length; i++) {
    przyciski[i].style.backgroundColor = '#FFAEA5';  // wszystkie: kolor nieaktywny
  }
  klikniety.style.backgroundColor = 'MistyRose';    // tylko kliknięty: aktywny
}
Podgląd

To dokładnie mechanizm z arkusza INF.03-08-25.06 („Baza smoków”): aktywny przycisk na MistyRose, pozostałe na #FFAEA5. Zauważ kolejność: najpierw wszystkim ustaw kolor nieaktywny, potem jednemu aktywny – inaczej po drugim kliknięciu „aktywne” byłyby dwa.

Zdarzenia myszy

Zdarzenie (atrybut)Kiedy
click (onclick)kliknięcie lewym przyciskiem (naciśnięcie i puszczenie na tym samym elemencie)
dblclick (ondblclick)dwukrotne szybkie kliknięcie
mousedown / mouseupnaciśnięcie / puszczenie przycisku myszy
mouseover (onmouseover)kursor wjechał na element (lub na jego dziecko)
mouseout (onmouseout)kursor wyjechał z elementu (lub na jego dziecko)
mouseenter / mouseleavejak wyżej, ale bez reagowania na dzieci – wygodniejsze do podświetlania
mousemovekażdy ruch kursora nad elementem
contextmenuprawy przycisk (menu kontekstowe)
Najechanie i kliknięcie
const karta = document.getElementById('karta');
const log = document.getElementById('log');

karta.addEventListener('mouseover', () => { karta.style.background = 'lightyellow'; });
karta.addEventListener('mouseout', () => { karta.style.background = '#eee'; });
karta.addEventListener('click', () => { log.textContent = 'Kliknięcie'; });
karta.addEventListener('dblclick', () => { log.textContent = 'Podwójne kliknięcie!'; });
karta.addEventListener('contextmenu', (e) => {
  e.preventDefault();                       // bez menu przeglądarki
  log.textContent = 'Prawy przycisk – menu zablokowane';
});
Podgląd

Zdarzenie nie musi dotyczyć przycisku. W arkuszach klikało się w cytaty (INF.03-10-24.06), miniatury obrazów (INF.03-03-26.01) i bloki nawigacji. Każdy element HTML może mieć onclick.

Zdarzenia klawiatury

ZdarzenieKiedyUwagi
keydown (onkeydown)klawisz naciśnięty (powtarza się przy trzymaniu)podstawowe – reaguje też na strzałki, Esc, F-klawisze
keyup (onkeyup)klawisz puszczonydobre do „po wpisaniu znaku” – value jest już zaktualizowane
keypressprzestarzałe (deprecated) – nie używajbywa w starszych materiałach i testach; zamiennik: keydown

Który klawisz? event.key – czytelny napis: 'a', 'A' (z Shiftem), 'Enter', 'Escape', 'ArrowUp', ' ' (spacja), 'Backspace'.

Klawiatura
const pole = document.getElementById('pole');
let nacisniec = 0;

pole.addEventListener('keydown', (event) => {
  nacisniec++;
  document.getElementById('klawisz').textContent = 'Ostatni klawisz: ' + event.key + ' (code: ' + event.code + ')';
  document.getElementById('licznik').textContent = 'Naciśnięć: ' + nacisniec;

  if (event.key === 'Enter') {
    document.getElementById('wynik').textContent = 'Wysłano: ' + pole.value;
    pole.value = '';
  }
  if (event.key === 'Escape') pole.value = '';
});
Podgląd

Zdarzenia klawiatury trafiają do elementu, który ma fokus (focus) – aktywne pole, przycisk. Żeby łapać klawisze na całej stronie (gra, skróty), nasłuchuj na document: document.addEventListener('keydown', …).

Formularze: focus, blur, change, input

ZdarzenieKiedy
focus (onfocus)pole dostało fokus (kliknięte, Tab)
blur (onblur)pole straciło fokus – użytkownik je opuścił
input (oninput)wartość zmienia się przy każdym znaku
change (onchange)wartość zatwierdzona: pole tekstowe po opuszczeniu, checkbox/radio/select natychmiast po zmianie
Sprawdź się

Które zdarzenie uruchomi się w chwili, gdy użytkownik wypełni pole tekstowe i przejdzie klawiszem Tab do następnego?

blur, input i change
const log = document.getElementById('log');
const imie = document.getElementById('imie');

imie.addEventListener('focus', () => { imie.style.background = 'lightyellow'; });
imie.addEventListener('blur', () => {
  imie.style.background = '';
  log.textContent = 'Opuszczono pole, wpisano: ' + imie.value;
});
imie.addEventListener('input', () => {
  log.textContent = 'Piszesz… znaków: ' + imie.value.length;
});
document.getElementById('rozmiar').addEventListener('change', (e) => {
  log.textContent = 'Rozmiar: ' + e.target.value;
});
document.getElementById('zgoda').addEventListener('change', (e) => {
  log.textContent = 'Zgoda: ' + e.target.checked;
});
Podgląd

blur jest w arkuszach od 2024 r.: pasek postępu rosnący po opuszczeniu każdego pola (INF.03-08-24.06) i zmiana rozmiaru czcionki po opuszczeniu pola (EE.09-06-22.01). Odczyt wartości kontrolek szczegółowo omawia lekcja Odczyt kontrolek formularza.

load: gdy strona jest gotowa

load na window zachodzi, gdy wczytano całą stronę razem z obrazami. W dialekcie egzaminacyjnym to <body onload="start()">. Nowocześniejsze DOMContentLoaded na document odpala się wcześniej – gdy drzewo DOM jest zbudowane, bez czekania na obrazy.

load.html
<body onload="start()">                         <!-- dialekt egzaminacyjny -->

<script>
  window.addEventListener('load', start);       // po wszystkim, z obrazami
  document.addEventListener('DOMContentLoaded', start); // gdy DOM gotowy
</script>

Jeśli skrypt stoi na końcu <body> (lub ma defer), elementy już istnieją i load nie jest potrzebny – to najprostsze rozwiązanie na egzaminie.

submit i blokowanie wysłania formularza

Sprawdź się

Które zdarzenie uruchamia skrypt w momencie wysyłania formularza i pozwala je zablokować, gdy dane są błędne?

Formularz wysyła dane i przeładowuje stronę – a wtedy twój wynik znika. Zdarzenie submit pozwala to zatrzymać:

submit i preventDefault
document.getElementById('f').addEventListener('submit', (event) => {
  event.preventDefault();                  // nie wysyłaj, nie przeładowuj strony
  const email = document.getElementById('email').value;
  document.getElementById('komunikat').textContent = email.includes('@')
    ? 'Dziękujemy, ' + email
    : 'Podaj poprawny adres.';
});
Podgląd

W dialekcie egzaminacyjnym to samo robi atrybut: <form onsubmit="return sprawdz()"> – gdy sprawdz() zwróci false, formularz nie zostanie wysłany. W addEventListener samo return false nie działa – potrzebujesz event.preventDefault(). Walidacją zajmiesz się w lekcji Walidacja formularzy.

Jeszcze prościej: jeśli przycisk ma tylko uruchomić skrypt, daj mu type="button" albo nie wkładaj go w <form> – wtedy nie ma czego blokować. Tak najprościej zbudować stronę na egzaminie: przycisk „Oblicz” z onclick, bez <form> dookoła.

Zmiana stanu a przełączanie

Sprawdź się

Tekst akapitu p1 jest początkowo niebieski. Co stanie się z kolorem po pierwszym i po drugim kliknięciu przycisku?

<button onclick="document.getElementById('p1').style.color = 'red'">
Zmień
</button>

Przypisanie style.color = 'red' ustawia stan. Żeby przełączać (toggle) – włącz/wyłącz, pokaż/ukryj, ikona on/off – musisz sprawdzić, jak jest teraz, i ustawić przeciwnie. Są dwa sposoby:

Ustaw vs przełącz
const p1 = document.getElementById('p1');
let liczbaKlikniec = 0;

document.getElementById('ustaw').addEventListener('click', () => {
  p1.style.color = 'red';                                 // zawsze to samo
});

// sposób 1: sprawdź aktualną wartość w DOM
document.getElementById('przelacz').addEventListener('click', () => {
  p1.style.color = p1.style.color === 'red' ? 'blue' : 'red';
});

// sposób 2: zmienna stanu poza funkcją
let widoczny = true;
document.getElementById('pokazUkryj').addEventListener('click', () => {
  widoczny = !widoczny;
  p1.style.display = widoczny ? 'block' : 'none';
  liczbaKlikniec++;
  document.getElementById('licznik').textContent = 'Kliknięć: ' + liczbaKlikniec;
});
Podgląd

Zmienna stanu (widoczny, liczbaKlikniec) musi być zadeklarowana poza funkcją obsługi – inaczej przy każdym kliknięciu startowałaby od nowa. Rozbudujesz ten pomysł w lekcji Stan aplikacji.

Na egzaminie

Ściąga

SkładniaCo robiPrzykład
<el onclick="f()">atrybut HTML – kod do wykonania (dialekt egzaminacyjny)<button onclick="oblicz()">
<el onclick="f(this)">przekazanie klikniętego elementuonclick="zaznacz(this)"
el.onclick = fwłaściwość – jedna funkcja, bez nawiasówbtn.onclick = oblicz;
el.addEventListener('typ', f)rejestracja funkcji (wiele możliwych)btn.addEventListener('click', oblicz)
el.addEventListener('typ', () => f(2))z argumentem – przez funkcję strzałkową
el.removeEventListener('typ', f)usunięcie (ta sama referencja)
{ once: true }funkcja uruchomi się razaddEventListener('click', f, { once: true })
event.targetelement, na którym zaszło zdarzenieevent.target.textContent
event.keyklawisz: 'Enter', 'a', 'ArrowLeft', ' 'if (event.key === 'Enter')
event.preventDefault()blokuje domyślną akcjęformularz, link, prawy przycisk
click, dblclickkliknięcie, podwójne
mouseover / mouseoutwjazd / wyjazd kursora (także z dzieci)
mouseenter / mouseleavewjazd / wyjazd bez dziecipodświetlanie
mousemove, contextmenuruch kursora, prawy przycisk
keydown / keyupklawisz naciśnięty / puszczony (keypress – przestarzałe)
focus / blurpole aktywne / opuszczonepasek postępu po blur
input / changekażdy znak / zatwierdzona zmianaselect, checkbox → change
submitwysłanie formularzaonsubmit="return false" blokuje
load (<body onload>), DOMContentLoadedstrona wczytana / DOM gotowy
stan = !stanprzełączaniewidoczny = !widoczny

Zadania

Zadanie 1
łatwe

Licznik kliknięć i klawiszy

Zbuduj stronę z przyciskiem „Klik”, polem tekstowym i dwoma akapitami. Skrypt:

  1. po każdym kliknięciu przycisku zwiększa licznik i wpisuje do pierwszego akapitu Kliknięć: N;
  2. po każdym naciśnięciu klawisza w polu (keydown) zwiększa drugi licznik i wpisuje do drugiego akapitu Klawiszy: M, ostatni: X, gdzie X to event.key;
  3. podwójne kliknięcie przycisku zeruje oba liczniki.

Użyj addEventListener. Liczniki zadeklaruj poza funkcjami.

Pokaż rozwiązanie
Liczniki
let liczbaKlikniec = 0;      // stan poza funkcjami – nie zeruje się przy każdym zdarzeniu
let liczbaKlawiszy = 0;
const kliki = document.getElementById('kliki');
const klawisze = document.getElementById('klawisze');
const przycisk = document.getElementById('klik');

przycisk.addEventListener('click', () => {
  liczbaKlikniec++;
  kliki.textContent = 'Kliknięć: ' + liczbaKlikniec;
});

document.getElementById('pole').addEventListener('keydown', (event) => {
  liczbaKlawiszy++;
  klawisze.textContent = 'Klawiszy: ' + liczbaKlawiszy + ', ostatni: ' + event.key;
});

przycisk.addEventListener('dblclick', () => {   // dblclick zachodzi po dwóch click, więc zerowanie wykonuje się jako ostatnie
  liczbaKlikniec = 0;
  liczbaKlawiszy = 0;
  kliki.textContent = 'Kliknięć: 0';
  klawisze.textContent = 'Klawiszy: 0';
});
Podgląd
Zadanie 2
średnie

Ikona włącz/wyłącz

Zadanie wzorowane na arkuszu EE.09-07-22.01 („Galeria”): kliknięcie ikony przełącza ją między icon-off.png a icon-on.png „i tak na zmianę”, realizowane funkcją. Pod ikoną akapit pokazuje Stan: wyłączony / Stan: włączony.

Napisz funkcję przelacz() podpiętą atrybutem onclick do obrazu. Rozwiąż dwoma sposobami: (a) sprawdzając, czy src obrazu zawiera napis on (includes), (b) zmienną logiczną wlaczony. Zamiast plików możesz użyć obrazów z https://placehold.co/80x80?text=OFF i …?text=ON.

Pokaż rozwiązanie
Ikona on/off
const ikona = document.getElementById('ikona');
const stan = document.getElementById('stan');
let wlaczony = false;                      // sposób (b): zmienna stanu

function przelacz() {
  wlaczony = !wlaczony;                    // odwrócenie stanu
  if (wlaczony) {
    ikona.src = 'https://placehold.co/80x80/9d9/030?text=ON';
    ikona.alt = 'włączone';
    stan.textContent = 'Stan: włączony';
  } else {
    ikona.src = 'https://placehold.co/80x80/ccc/333?text=OFF';
    ikona.alt = 'wyłączone';
    stan.textContent = 'Stan: wyłączony';
  }
}

// sposób (a) – bez zmiennej, odczyt stanu z DOM:
// function przelacz() {
//   if (ikona.src.includes('ON')) { ikona.src = '...OFF'; } else { ikona.src = '...ON'; }
// }
Podgląd

Z plikami icon-on.png / icon-off.png sposób (a) to ikona.src.includes('icon-on'). Uwaga: ikona.src zwraca pełny adres (http://localhost/…/icon-on.png), nie sam napis z HTML – dlatego porównuj przez includes, nie ===.

Zadanie 3
średniejak na INF.03

Pasek postępu po opuszczeniu pola

Zadanie wzorowane na arkuszu INF.03-08-24.06 („Rejestracja klienta”). Formularz ma 7 pól tekstowych i pasek postępu – div o id pasek wewnątrz div#tlo, początkowo o szerokości 16 %. Opuszczenie (utrata fokusu) każdego z pól zwiększa szerokość paska o 12 punktów procentowych (16 % → 28 % → 40 %…). Szerokość nigdy nie może przekroczyć 100 %. W pasku wyświetla się aktualna wartość, np. 40%.

HTML:

rejestracja.html (fragment)
<div id="tlo"><div id="pasek">16%</div></div>
<input placeholder="Imię"> <input placeholder="Nazwisko"> <input placeholder="Ulica">
<input placeholder="Miasto"> <input placeholder="Kod"> <input placeholder="E-mail"> <input placeholder="Telefon">

Kryteria oceny:

  1. Skrypt w JavaScript, funkcja uruchamiana zdarzeniem utraty fokusu (blur/onblur) pola.
  2. Zdarzenie obsłużone dla każdego z 7 pól (sprawdzane na dwóch różnych polach).
  3. Szerokość paska zmieniana przez style.width o 12 % przy każdym zdarzeniu.
  4. Zabezpieczenie: szerokość nie przekracza 100 % (sprawdzane po opuszczeniu wszystkich pól).
  5. Tekst w pasku zgodny z szerokością (28%, 40%…).
  6. Znaczące nazwy zmiennych i funkcji.
Pokaż rozwiązanie
Pasek postępu
let postep = 16;                                   // stan paska poza funkcją
const pasek = document.getElementById('pasek');

function zwiekszPostep() {                         // kryterium 1
  postep += 12;                                    // kryterium 3
  if (postep > 100) postep = 100;                  // kryterium 4
  pasek.style.width = postep + '%';
  pasek.textContent = postep + '%';                // kryterium 5
}

// kryterium 2: to samo zdarzenie dla każdego pola – pętla zamiast 7 atrybutów onblur
const pola = document.getElementsByTagName('input');
for (let i = 0; i < pola.length; i++) {
  pola[i].addEventListener('blur', zwiekszPostep);
}
Podgląd

Wersja w dialekcie egzaminacyjnym: każdemu <input> dopisujesz onblur="zwiekszPostep()". Pętla robi to samo w trzech linijkach i nie da się pominąć żadnego pola. Zamiast if możesz użyć Math.min(postep + 12, 100).

Zadanie 4
trudnejak na INF.03

Sekcje po najechaniu

Zadanie wzorowane na arkuszu INF.03-09-26.01 („Stylizacja paznokci”). Na stronie są trzy przyciski: Kolor, Kształt, Wzór, a pod nimi trzy sekcje (div o id kolor, ksztalt, wzor) z opisami. Na start widoczna jest tylko sekcja kolor.

Najechanie kursorem na przycisk pokazuje odpowiednią sekcję (display: block) i ukrywa dwie pozostałe (display: none). Aktywny przycisk ma tło Salmon, pozostałe – Crimson. Zrealizuj to jedną funkcją z parametrem (nazwa sekcji), a nie trzema osobnymi.

Kryteria oceny:

  1. Skrypt w JavaScript, funkcja uruchamiana zdarzeniem najechania (mouseover/onmouseover), nie kliknięcia.
  2. Jedna funkcja parametryczna obsługuje wszystkie trzy przyciski.
  3. Po najechaniu widoczna jest wyłącznie wybrana sekcja (sprawdzane dla dwóch przycisków).
  4. Tło aktywnego przycisku Salmon, pozostałych Crimson – także po zmianie aktywnego.
  5. Stan początkowy: sekcja kolor widoczna, przycisk Kolor aktywny.
  6. Znaczące nazwy zmiennych i funkcji.
Pokaż rozwiązanie
Sekcje po najechaniu
<button id="btn-kolor" onmouseover="pokazSekcje('kolor')">Kolor</button>
<button id="btn-ksztalt" onmouseover="pokazSekcje('ksztalt')">Kształt</button>
<button id="btn-wzor" onmouseover="pokazSekcje('wzor')">Wzór</button>

<div id="kolor" class="sekcja">Kolor: wybierz lakier z 40 odcieni.</div>
<div id="ksztalt" class="sekcja">Kształt: migdał, kwadrat, owal.</div>
<div id="wzor" class="sekcja">Wzór: ombre, french, zdobienia.</div>
Podgląd

Zamiast atrybutów onmouseover możesz podpiąć zdarzenia w JS: document.getElementById('btn-kolor').addEventListener('mouseover', () => pokazSekcje('kolor')); – zwróć uwagę na funkcję strzałkową, która dopiero po najechaniu wywoła pokazSekcje z argumentem. Ten sam wzorzec z click rozwiązuje zakładki z czerwca 2024 i nawigację z czerwca 2025.

Test powtórkowy

Test powtórkowy

Format jak w części pisemnej INF.03: cztery odpowiedzi, jedna poprawna.

0/0poprawnych
Sprawdź się

Tekst w akapicie p1 ma początkowo kolor niebieski. Co można powiedzieć o kolorze tekstu po dwukrotnym kliknięciu przycisku?

<button onclick="document.getElementById('p1').style.color = 'red'">
Zmień kolor
</button>
Sprawdź się

Które zdarzenie formularza pozwala uruchomić skrypt przy wysyłaniu danych i w razie błędów zablokować wysłanie?

Sprawdź się

Po załadowaniu strony z poniższym kodem i kliknięciu przycisku o id btn

function policz() { alert('OK'); }
document.getElementById('btn').addEventListener('click', policz());
Sprawdź się

Który zapis w HTML poprawnie uruchomi funkcję oblicz po kliknięciu przycisku?

Sprawdź się

Które zdarzenie zachodzi w chwili, gdy użytkownik przestaje edytować pole tekstowe i przechodzi do innego elementu strony?

Sprawdź się

Jak sprawdzić w funkcji obsługi zdarzenia keydown, czy naciśnięto klawisz Enter?

Sprawdź się

Który obraz będzie wyświetlony po kliknięciu na obraz?

<img id="foto" src="kol1.jpg"
   onclick="document.getElementById('foto').src = 'kol2.jpg'">
Sprawdź się

Arkusz wymaga, aby sekcja pojawiała się po najechaniu kursorem na przycisk. Którego zdarzenia należy użyć?

Sprawdź się

Co się stanie po załadowaniu strony?

var btn = document.getElementById('btn');
btn.onclick = function () { alert('A'); };
btn.onclick = function () { alert('B'); };
Sprawdź się

Fragment kodu ma za zadanie

var widoczny = true;
function przelacz() {
widoczny = !widoczny;
document.getElementById('menu').style.display = widoczny ? 'block' : 'none';
}