Metodyka pracy ze specyfikacją zadania, analiza wejście-przetwarzanie-wynik, debugowanie w konsoli przeglądarki oraz kompleksowy konfigurator.
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:
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ł';
}
}
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ł';
}
}
Jaki jest zalecany pierwszy krok podczas implementacji skryptu na podstawie specyfikacji zadania?
Poprawna: b) Rozpoczęcie od wypisania wejść, algorytmu przetwarzania i elementów wyjściowych zapobiega chaosowi w kodzie.
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 ).
<label>Kwota lokaty (zł):<br><input id="kwotaLokaty" type="number" value="5000"></label><br>
<label>Oprocentowanie roczne (%):<br><input id="procentRoczny" type="number" value="6.5" step="0.1"></label><br>
<button onclick="diagnozujIKalkuluj()">Oblicz zysk po roku</button>
<p id="wynikOdsetek"></p>
<script src="skrypt.js"></script>
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';
}
Co najczęściej oznacza komunikat błędu TypeError: Cannot read properties of null w konsoli przeglądarki?
Poprawna: d) Metoda getElementById zwróciła null z powodu braku elementu o wskazanym id lub literówki w nazwie.
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ą…
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';
}
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';
}
W jaki sposób zabezpieczyć kompleksowy kalkulator przed błędnym wejściem z pola imię klienta?
Poprawna: a) Weryfikacja pustego łańcucha po trim() wraz z wczesnym wyjściem zabezpiecza logikę przed niekompletnymi danymi.