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 przedrostkiemon: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
<button onclick="powitaj('atrybut')">1. atrybut onclick</button>
<button id="b2">2. właściwość onclick</button>
<button id="b3">3. addEventListener</button>
<p id="wynik">Kliknij dowolny przycisk.</p>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');
});| Sposób | Zapis | Zalety | Wady |
|---|---|---|---|
| atrybut HTML (dialekt egzaminacyjny) | <button onclick="oblicz()"> | widoczny w HTML, jedna linia, w każdej tabeli pomocniczej CKE | miesza HTML z JS, jedna funkcja na zdarzenie, kod w cudzysłowie |
| właściwość elementu | btn.onclick = oblicz; | prosty, czysty JS | tylko jedna funkcja – kolejne przypisanie nadpisuje poprzednie |
addEventListener | btn.addEventListener('click', oblicz); | wiele funkcji, da się usunąć, dodatkowe opcje, standard w kodzie zawodowym | najdł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ę.
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.
<button class="opcja">Mały</button>
<button class="opcja">Średni</button>
<button class="opcja">Duży</button>
<p id="info">Kliknij rozmiar.</p>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));Najważniejsze pola:
| Pole / metoda | Co zawiera | Typ zdarzeń |
|---|---|---|
event.type | nazwa zdarzenia: 'click', 'keydown'… | wszystkie |
event.target | element, na którym zaszło zdarzenie | wszystkie |
event.currentTarget | element, na którym zarejestrowano funkcję (zwykle ten sam) | wszystkie |
event.key | naciśnięty klawisz jako napis: 'a', 'Enter', 'ArrowLeft', ' ' | klawiatura |
event.code | fizyczny klawisz: 'KeyA', 'Enter', 'Space' | klawiatura |
event.clientX, event.clientY | pozycja kursora w oknie | mysz |
event.button | 0 lewy, 1 środkowy, 2 prawy | mysz |
event.shiftKey, event.ctrlKey, event.altKey | czy trzymano modyfikator | mysz 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ł.
<button onclick="zaznacz(this)">Baza</button>
<button onclick="zaznacz(this)">Opisy</button>
<button onclick="zaznacz(this)">Galeria</button>button { background: #ffaea5; border: 0; padding: 8px 16px; margin-right: 6px; }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
}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 / mouseup | naciś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 / mouseleave | jak wyżej, ale bez reagowania na dzieci – wygodniejsze do podświetlania |
mousemove | każdy ruch kursora nad elementem |
contextmenu | prawy przycisk (menu kontekstowe) |
<div id="karta">Najedź na mnie, kliknij, kliknij dwa razy.</div>
<p id="log"></p>#karta { padding: 20px; background: #eee; border: 2px solid #999; user-select: none; }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';
});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
| Zdarzenie | Kiedy | Uwagi |
|---|---|---|
keydown (onkeydown) | klawisz naciśnięty (powtarza się przy trzymaniu) | podstawowe – reaguje też na strzałki, Esc, F-klawisze |
keyup (onkeyup) | klawisz puszczony | dobre do „po wpisaniu znaku” – value jest już zaktualizowane |
keypress | przestarzałe (deprecated) – nie używaj | bywa w starszych materiałach i testach; zamiennik: keydown |
Który klawisz? event.key – czytelny napis: 'a', 'A' (z Shiftem), 'Enter', 'Escape', 'ArrowUp', ' ' (spacja), 'Backspace'.
<input id="pole" placeholder="Pisz tutaj i naciśnij Enter">
<p id="klawisz">Ostatni klawisz: –</p>
<p id="licznik">Naciśnięć: 0</p>
<p id="wynik"></p>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 = '';
});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
| Zdarzenie | Kiedy |
|---|---|
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 |
Które zdarzenie uruchomi się w chwili, gdy użytkownik wypełni pole tekstowe i przejdzie klawiszem Tab do następnego?
<input id="imie" placeholder="Imię">
<select id="rozmiar">
<option value="S">S</option>
<option value="M">M</option>
<option value="L">L</option>
</select>
<label><input type="checkbox" id="zgoda"> Zgoda</label>
<p id="log">–</p>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;
});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.
<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
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ć:
<form id="f">
<input id="email" placeholder="e-mail" required>
<button type="submit">Wyślij</button>
</form>
<p id="komunikat"></p>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.';
});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
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:
<p id="p1">Akapit testowy</p>
<button id="ustaw">Ustaw czerwony</button>
<button id="przelacz">Przełącz czerwony/niebieski</button>
<button id="pokazUkryj">Pokaż/ukryj</button>
<p id="licznik">Kliknięć: 0</p>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;
});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ładnia | Co robi | Przykład |
|---|---|---|
<el onclick="f()"> | atrybut HTML – kod do wykonania (dialekt egzaminacyjny) | <button onclick="oblicz()"> |
<el onclick="f(this)"> | przekazanie klikniętego elementu | onclick="zaznacz(this)" |
el.onclick = f | właściwość – jedna funkcja, bez nawiasów | btn.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ę raz | addEventListener('click', f, { once: true }) |
event.target | element, na którym zaszło zdarzenie | event.target.textContent |
event.key | klawisz: 'Enter', 'a', 'ArrowLeft', ' ' | if (event.key === 'Enter') |
event.preventDefault() | blokuje domyślną akcję | formularz, link, prawy przycisk |
click, dblclick | kliknięcie, podwójne | |
mouseover / mouseout | wjazd / wyjazd kursora (także z dzieci) | |
mouseenter / mouseleave | wjazd / wyjazd bez dzieci | podświetlanie |
mousemove, contextmenu | ruch kursora, prawy przycisk | |
keydown / keyup | klawisz naciśnięty / puszczony (keypress – przestarzałe) | |
focus / blur | pole aktywne / opuszczone | pasek postępu po blur |
input / change | każdy znak / zatwierdzona zmiana | select, checkbox → change |
submit | wysłanie formularza | onsubmit="return false" blokuje |
load (<body onload>), DOMContentLoaded | strona wczytana / DOM gotowy | |
stan = !stan | przełączanie | widoczny = !widoczny |
Zadania
Licznik kliknięć i klawiszy
Zbuduj stronę z przyciskiem „Klik”, polem tekstowym i dwoma akapitami. Skrypt:
- po każdym kliknięciu przycisku zwiększa licznik i wpisuje do pierwszego akapitu
Kliknięć: N; - po każdym naciśnięciu klawisza w polu (
keydown) zwiększa drugi licznik i wpisuje do drugiego akapituKlawiszy: M, ostatni: X, gdzie X toevent.key; - podwójne kliknięcie przycisku zeruje oba liczniki.
Użyj addEventListener. Liczniki zadeklaruj poza funkcjami.
Pokaż rozwiązanie
<button id="klik">Klik</button>
<input id="pole" placeholder="Pisz tutaj">
<p id="kliki">Kliknięć: 0</p>
<p id="klawisze">Klawiszy: 0</p>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';
});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
<img id="ikona" src="https://placehold.co/80x80/ccc/333?text=OFF" alt="wyłączone" onclick="przelacz()">
<p id="stan">Stan: wyłączony</p>#ikona { cursor: pointer; }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'; }
// }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 ===.
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:
<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:
- Skrypt w JavaScript, funkcja uruchamiana zdarzeniem utraty fokusu (
blur/onblur) pola. - Zdarzenie obsłużone dla każdego z 7 pól (sprawdzane na dwóch różnych polach).
- Szerokość paska zmieniana przez
style.widtho 12 % przy każdym zdarzeniu. - Zabezpieczenie: szerokość nie przekracza 100 % (sprawdzane po opuszczeniu wszystkich pól).
- Tekst w pasku zgodny z szerokością (
28%,40%…). - Znaczące nazwy zmiennych i funkcji.
Pokaż rozwiązanie
<div id="tlo"><div id="pasek">16%</div></div>
<input placeholder="Imię"> <input placeholder="Nazwisko"> <input placeholder="Ulica"><br>
<input placeholder="Miasto"> <input placeholder="Kod"> <input placeholder="E-mail"> <input placeholder="Telefon">#tlo { width: 100%; background: #ddd; margin-bottom: 10px; }
#pasek { width: 16%; background: seagreen; color: white; padding: 4px 0; text-align: center; }
input { width: 120px; margin: 4px 2px; }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);
}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).
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:
- Skrypt w JavaScript, funkcja uruchamiana zdarzeniem najechania (
mouseover/onmouseover), nie kliknięcia. - Jedna funkcja parametryczna obsługuje wszystkie trzy przyciski.
- Po najechaniu widoczna jest wyłącznie wybrana sekcja (sprawdzane dla dwóch przycisków).
- Tło aktywnego przycisku Salmon, pozostałych Crimson – także po zmianie aktywnego.
- Stan początkowy: sekcja
kolorwidoczna, przycisk Kolor aktywny. - Znaczące nazwy zmiennych i funkcji.
Pokaż rozwiązanie
<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>button { background: Crimson; color: white; border: 0; padding: 8px 16px; margin-right: 6px; }
.sekcja { display: none; margin-top: 16px; padding: 16px; background: #f6f6f6; }const nazwySekcji = ['kolor', 'ksztalt', 'wzor'];
function pokazSekcje(nazwa) { // kryterium 2: jeden parametr
for (const sekcja of nazwySekcji) {
const aktywna = sekcja === nazwa;
document.getElementById(sekcja).style.display = aktywna ? 'block' : 'none'; // kryterium 3
document.getElementById('btn-' + sekcja).style.backgroundColor = aktywna ? 'Salmon' : 'Crimson'; // kryterium 4
}
}
pokazSekcje('kolor'); // kryterium 5: stan początkowyZamiast 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.
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>Które zdarzenie formularza pozwala uruchomić skrypt przy wysyłaniu danych i w razie błędów zablokować wysłanie?
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());Który zapis w HTML poprawnie uruchomi funkcję oblicz po kliknięciu przycisku?
Które zdarzenie zachodzi w chwili, gdy użytkownik przestaje edytować pole tekstowe i przechodzi do innego elementu strony?
Jak sprawdzić w funkcji obsługi zdarzenia keydown, czy naciśnięto klawisz Enter?
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'">Arkusz wymaga, aby sekcja pojawiała się po najechaniu kursorem na przycisk. Którego zdarzenia należy użyć?
Co się stanie po załadowaniu strony?
var btn = document.getElementById('btn');
btn.onclick = function () { alert('A'); };
btn.onclick = function () { alert('B'); };Fragment kodu ma za zadanie
var widoczny = true;
function przelacz() {
widoczny = !widoczny;
document.getElementById('menu').style.display = widoczny ? 'block' : 'none';
}