MODUŁ 14
Próba przekrojowa i diagnostyka błędów
PPrezentacja dla nauczyciela
W ostatnim module zbieramy wszystkie zdobyte umiejętności w spójną całość. Poznasz sprawdzoną metodykę rozwiązywania zadań praktycznych krok po kroku: od wypisania danych wejściowych, przez szybką diagnostykę błędów w konsoli, po stworzenie kompletnego, działającego konfiguratora.
Metodyka pracy i analiza wymagań skryptu
Sukces przy tworzeniu skryptów przeglądarkowych opiera się na zdyscyplinowanej i powtarzalnej metodyce pracy. Zamiast pisać od razu cały, rozbudowany program, warto podzielić realizację na cztery przejrzyste etapy:
- Identyfikacja wejść i wyjść: Wypisz wszystkie elementy formularza, z których skrypt będzie czytać dane, oraz elementy DOM, w których wyświetlisz wyniki. Sprawdź ich atrybuty
idbezpośrednio w kodzie HTML, aby wykluczyć literówki. - Zbudowanie szkieletu: Napisz minimalną działającą funkcję: odczytaj wartość, wykonaj proste działanie i wypisz wynik do wskazanego akapitu. Uruchom skrypt i upewnij się, że podłączenie działa.
- Implementacja warunków i szczegółów: Dodaj naliczanie rabatów, sprawdzanie pól wyboru oraz walidację danych wejściowych.
- Weryfikacja przypadków testowych: Przetestuj działanie skryptu dla przypadku typowego, wartości granicznych (np. dokładnie na progu rabatowym) oraz przy błędnych lub pustych danych wejściowych.
function przeliczPizze() {
const rozmiarCena = Number(document.getElementById('rozmiarPizzy').value);
const kodPromo = document.getElementById('kodPromo').value.trim().toUpperCase();
const czyDostawa = document.getElementById('opcjaDostawa').checked;
const wynik = document.getElementById('podsumowaniePizzy');
let koszt = rozmiarCena;
if (czyDostawa) {
koszt += 8;
}
if (kodPromo === 'PIZZA10') {
koszt = koszt * 0.90;
wynik.textContent = 'Cena po rabacie: ' + koszt.toFixed(2) + ' zł (kod aktywny)';
} else {
wynik.textContent = 'Do zapłaty: ' + koszt.toFixed(2) + ' zł';
}
}
Diagnozowanie błędów i praca z konsolą
Gdy strona nie reaguje na kliknięcie przycisku lub wyświetla nieoczekiwane wyniki, pierwszym miejscem inspekcji powinna być zawsze konsola narzędzi deweloperskich przeglądarki (skrót klawiszowy F12 lub Ctrl + Shift + I).
Najczęstsze błędy i ich przyczyny:
TypeError: Cannot read properties of null (reading 'value')— metodagetElementById()zwróciłanull.Oznacza to literówkę w identyfikatorze, brak elementu w kodzie HTML lub próbę odpytania DOM przed jego załadowaniem.- Niezamierzone sklejenie tekstu zamiast dodawania (np.
"50" + "20" = "5020") — brak jawnej konwersji za pomocąNumber(). - Sprawdzanie stanu checkboxa przez
pole.valuezamiast właściwościpole.checked. ReferenceError: nazwaFunkcji is not defined— literówka w nazwie funkcji w atrybucieonclicklub niepodłączony plik<script src="...">.
Do śledzenia wartości zmiennych w trakcie działania skryptu używaj metody console.log('Wartość:', zmienna). Po poprawieniu kodu w pliku zawsze odśwież stronę w przeglądarce przed ponownym testem.
function diagnozujIKalkuluj() {
const poleLokaty = document.getElementById('kwotaLokaty');
const poleProcent = document.getElementById('procentRoczny');
const wynik = document.getElementById('wynikOdsetek');
console.log('Sprawdzanie pól formularza:', poleLokaty, poleProcent);
if (!poleLokaty || !poleProcent) {
console.error('Błąd: nie znaleziono elementów formularza w drzewie DOM!');
return;
}
const kwota = Number(poleLokaty.value);
const procent = Number(poleProcent.value);
console.log('Pobrane wartości liczbowe:', { kwota: kwota, procent: procent });
if (isNaN(kwota) || kwota <= 0 || isNaN(procent) || procent <= 0) {
wynik.textContent = 'Błąd: podaj poprawne wartości liczbowe większe od zera.';
wynik.style.color = '#dc2626';
return;
}
const zysk = kwota * (procent / 100);
console.log('Wyliczony roczny zysk:', zysk);
wynik.textContent = 'Roczny zysk z lokaty: ' + zysk.toFixed(2) + ' zł';
wynik.style.color = '#16a34a';
}
Kompleksowa integracja formularza i interfejsu
Praktyczne zadania ze skryptów przeglądarkowych rzadko ograniczają się do jednego elementu. Zwykle wymagają skoordynowania kilku kontrolek różnych typów: listy rozwijanej, przycisków radiowych, pól wyboru oraz pól tekstowych z walidacją obecności danych.
Kompletny skrypt realizuje następujący ciąg operacji:
- Pobiera i weryfikuje dane klienta — w razie pustego pola wyświetla ostrzeżenie (np. przez
alert()) i natychmiast przerywa działanie instrukcjąreturn, - Pobiera cenę bazową wybranej opcji z elementu
<select>, - Odczytuje wartość zaznaczonego przycisku radiowego za pomocą selektora
:checked, - Sprawdza stan dodatkowych pól typu checkbox za pomocą właściwości
checkedi dolicza opcjonalne koszty, - Formatuje łączną sumę metodą
.toFixed(2)i wpisuje szczegółowe podsumowanie do wskazanego elementu DOM.
function finalizujKonfiguracje() {
const imie = document.getElementById('klientImie').value.trim();
const podsumowanie = document.getElementById('podsumowanieZestawu');
if (imie === '') {
alert('Błąd: Podaj imię zamawiającego!');
podsumowanie.textContent = 'Proszę uzupełnić brakujące imię klienta.';
podsumowanie.style.color = '#dc2626';
return;
}
const cenaProcesora = Number(document.getElementById('procesorSelect').value);
const zaznaczonyRam = document.querySelector('input[name="ramWybor"]:checked');
const cenaRam = Number(zaznaczonyRam.value);
const montaz = document.getElementById('montazSprzetu');
let razem = cenaProcesora + cenaRam;
if (montaz.checked) {
razem += Number(montaz.value);
}
alert('Dziękujemy ' + imie + '! Zamówienie zostało zarejestrowane.');
podsumowanie.innerHTML = 'Klient: ' + imie + '
' +
'Koszt zestawu: ' + razem.toFixed(2) + ' zł (w tym montaż: ' +
(montaz.checked ? 'TAK' : 'NIE') + ')';
podsumowanie.style.color = '#16a34a';
}
Ćwiczenia
- 1Weryfikacja wartości liczbowej z obsługą NaNSprawdź za pomocą isNaN() czy wprowadzona wartość jest poprawną liczbą i wyświetl błąd.Zadanie i podpowiedzi →
- 2Walidacja formatu kodu pocztowegoSprawdź czy wprowadzony kod pocztowy ma dokładnie 6 znaków i myślnik na trzeciej pozycji.Zadanie i podpowiedzi →
- 3Weryfikacja zgodności i długości hasełSprawdź czy wpisane hasła są identyczne i mają wymaganą minimalną długość.Zadanie i podpowiedzi →
- 4Kalkulator kosztów wizyty w salonieOblicz sumę wybranej usługi fryzjerskiej i zaznaczonych opcji dodatkowych.Zadanie i podpowiedzi →
- 5Wycena przesyłki kurierskiej z dopłatą za wagęOblicz opłatę pocztową na podstawie gabarytu oraz dopłaty dla przesyłek ciężkich powyżej 10 kg.Zadanie i podpowiedzi →
- 6Konfigurator zamówienia pizzy z rabatemOblicz należność za pizzę wraz z dodatkami i uwzględnij 10% rabatu studenckiego.Zadanie i podpowiedzi →
- 7Blokada wysyłki formularza i walidacja e-mailaPrzechwyć submit formularza za pomocą preventDefault() i zbadaj obecność znaku @.Zadanie i podpowiedzi →
- 8Rejestr zgłoszeń z numeracją sekwencyjnąGeneruj wpisy zgłoszeń z automatycznie powiększanym numerem ewidencyjnym.Zadanie i podpowiedzi →
- 9Generator wizytówki firmowej z podglądem na żywoZaktualizuj dane tekstowe oraz kolor tła podglądu wizytówki na kliknięcie przycisku.Zadanie i podpowiedzi →
- 10Koszyk zakupowy z dynamiczną sumąDodawaj produkty do koszyka i na bieżąco aktualizuj łączną wartość zamówienia.Zadanie i podpowiedzi →
- 11Egzaminacyjny kalkulator kosztów podróżyWylicz koszt przejazdu na podstawie dystansu, średniego spalania i ceny paliwa za litr.Zadanie i podpowiedzi →
- 12Filtrowanie zleceń według statusu płatnościPrzefiltruj zamówienia z tablicy obiektów na podstawie wyboru ze znacznika select.Zadanie i podpowiedzi →
- 13Warunkowe pole uzasadnienia w ankiecie satysfakcjiOdsłoń dodatkowe pole tekstowe z uwagami, jeśli ocena klienta wynosi 1 lub 2.Zadanie i podpowiedzi →
- 14Wskaźnik siły hasła na zdarzenie inputOceń siłę hasła na bieżąco podczas wpisywania, modyfikując tekst i kolor etykiety.Zadanie i podpowiedzi →
- 15Dwukierunkowy konwerter temperaturPrzeliczaj temperaturę między skalą Celsjusza a Fahrenheita w zależności od wybranego trybu.Zadanie i podpowiedzi →
- 16Kompleksowy system rezerwacji biletów kinowychZbuduj pełną aplikację egzaminacyjną integrującą pola formularza, zniżki, dodatki i podsumowanie.Zadanie i podpowiedzi →