Przejdź do treści

Temat 13 · 2 × 45 minINF.03

Odczyt kontrolek formularza

Prawie każde zadanie praktyczne INF.03 z JavaScriptem zaczyna się tak samo: użytkownik coś wpisuje, zaznacza lub wybiera, klika przycisk, a skrypt odczytuje kontrolki i coś z nimi robi. W tej lekcji poznasz wszystkie kontrolki, jakie pojawiły się w arkuszach – od zwykłego pola tekstowego po pole wyboru pliku – i nauczysz się odczytywać je bez typowych błędów. Umiesz już znajdować elementy (lekcja 11) i reagować na kliknięcie (lekcja 12); teraz dochodzi odczyt tego, co w kontrolkach siedzi.

Formularz, jaki dostaniesz na egzaminie

Arkusz zwykle opisuje formularz słownie („pole numeryczne z etykietą Liczba kopii, dwa przyciski opcji, przycisk Dodaj do koszyka”), a ty budujesz go w HTML. Żeby skrypt mógł z niego czytać, każda kontrolka potrzebuje id (dla getElementById) albo przynajmniej wspólnej name (dla grupy radio). Dobrze zrobiony formularz wygląda tak:

formularz.html
<label for="imie">Imię:</label>
<input type="text" id="imie">

<label for="ilosc">Liczba sztuk:</label>
<input type="number" id="ilosc" min="1" value="1">

<input type="checkbox" id="zgoda"> <label for="zgoda">Akceptuję regulamin</label>

<input type="radio" name="rozmiar" value="S" id="rS"> <label for="rS">S</label>
<input type="radio" name="rozmiar" value="M" id="rM" checked> <label for="rM">M</label>

<select id="miasto">
  <option value="waw">Warszawa</option>
  <option value="krk">Kraków</option>
</select>

<button type="button" onclick="pokaz()">Pokaż</button>
<p id="wynik"></p>

Zwróć uwagę na type="button". Zwykły <button> wewnątrz <form> jest domyślnie przyciskiem wysyłającym formularz – strona się przeładuje i twój wynik zniknie. Na egzaminie najbezpieczniej w ogóle nie opakowywać kontrolek w <form> albo dać przyciskowi type="button".

value (napis)
input.valueselect.valuetextarea.value
text, number, password, textarea, range, select, file, color, date
checked (true/false)
checkbox.checkedradio.checked
checkbox, radio
dodatkowe
input.valueAsNumberselect.selectedIndexinput.files[0].name
Rys. 1. Co odczytujesz z której kontrolki

Pole tekstowe i liczbowe – value to zawsze napis

Właściwość value zwraca to, co jest wpisane w polu, jako napis (string). Dotyczy to także type="number" – przeglądarka pilnuje, żeby użytkownik wpisał liczbę, ale do skryptu i tak trafia "12", nie 12.

Sprawdź się

Użytkownik wpisał w pola liczbowe 5 i 3. Co wypisze ten kod?

var a = document.getElementById('a').value;
var b = document.getElementById('b').value;
document.getElementById('wynik').innerHTML = a + b;
Napis czy liczba?
document.getElementById('dodaj').addEventListener('click', () => {
  const tekstA = document.getElementById('a').value;   // "5" – napis!
  const tekstB = document.getElementById('b').value;   // "3"
  const liczbaA = parseFloat(tekstA);                  // 5 – liczba
  const liczbaB = parseFloat(tekstB);                  // 3
  document.getElementById('wynik').innerHTML =
    'Sklejanie napisów: ' + (tekstA + tekstB) + '<br>' +
    'Dodawanie liczb: ' + (liczbaA + liczbaB) + '<br>' +
    'typeof value: ' + typeof tekstA;
});
Podgląd

Trzy sposoby zamiany na liczbę

Sposób"12.5""12 zł""" (puste)Komentarz
parseFloat(tekst)12.512NaNczyta liczbę od początku napisu, resztę ignoruje; najczęstszy wybór
parseInt(tekst)1212NaNtylko część całkowita – do liczby sztuk, rat, kopii
Number(tekst)12.5NaN0cały napis musi być liczbą; puste pole daje 0, co bywa pułapką
pole.valueAsNumber12.5–NaNtylko dla type=number, range, date; od razu liczba, bez value
konwersja.js
const wpisane = '12.5';            // tak wygląda value
console.log(parseFloat(wpisane) + 1); // 13.5
console.log(parseInt(wpisane) + 1);   // 13
console.log(Number(wpisane) + 1);     // 13.5
console.log(Number('') , parseFloat(''));   // 0 NaN – puste pole zachowuje się różnie!
console.log(parseFloat('abc'));       // NaN
Konsola
Kliknij „Uruchom”, aby zobaczyć wynik

valueAsNumber jest wygodne: document.getElementById('ilosc').valueAsNumber daje od razu liczbę, a dla pustego pola NaN. Działa we wszystkich aktualnych przeglądarkach, ale tylko na polach typu number, range, date, time i podobnych – dla type="text" zawsze zwraca NaN. Na egzaminie parseFloat(...value) jest równie dobre i bardziej uniwersalne – wybierz jedno i trzymaj się go.

Zapis do kontrolki

value działa też w drugą stronę – przypisanie pole.value = 'Ala' wpisuje tekst do pola, a pole.value = '' je czyści (przydaje się po dodaniu pozycji do koszyka). Pamiętaj: treść pola zmieniasz przez value, nie przez innerHTML – <input> nie ma zawartości między tagami.

Pole wyboru (checkbox) – checked

Checkbox ma dwie przydatne właściwości: checked (true/false) oraz value – napis z atrybutu value, który jest taki sam niezależnie od zaznaczenia (domyślnie "on"). Do sprawdzenia, czy pole zaznaczono, służy więc wyłącznie checked.

Sprawdź się

Checkbox <input type='checkbox' id='zgoda' value='tak'> nie jest zaznaczony. Co wypisze console.log(zgoda.value, zgoda.checked)?

Najczęstszy wzorzec egzaminacyjny: kilka usług z cenami, zsumuj zaznaczone. Zasady oceniania mówią wprost, że skrypt ma testować zaznaczenie każdego pola osobno – dlatego każde if jest tu konieczne.

Suma zaznaczonych zabiegów
function policzCene() {
  let suma = 0;
  if (document.getElementById('strzyzenie').checked) suma += 60;
  if (document.getElementById('koloryzacja').checked) suma += 150;
  if (document.getElementById('modelowanie').checked) suma += 40;
  document.getElementById('wynik').innerHTML = 'Cena zabiegów: ' + suma + ' zł';
}
Podgląd

Gdy checkboxów jest więcej, wygodnie trzymać cenę w atrybucie value i przejść pętlą po zaznaczonych. Selektor :checked zwraca tylko zaznaczone pola, więc nie trzeba sprawdzać checked w pętli:

Suma pętlą po :checked
document.getElementById('policz').addEventListener('click', () => {
  const zaznaczone = document.querySelectorAll('.zabieg:checked');
  let suma = 0;
  for (const pole of zaznaczone) {
    suma += parseFloat(pole.value);   // value to napis – konwersja!
  }
  document.getElementById('wynik').textContent =
    `Zaznaczono ${zaznaczone.length} zabiegi, cena: ${suma} zł`;
});
Podgląd

Checkbox można też zaznaczyć ze skryptu: pole.checked = true. Przełączanie: pole.checked = !pole.checked.

Przyciski opcji (radio) – grupa z jednym zaznaczonym

Przyciski radio łączy wspólny atrybut name – w grupie może być zaznaczony tylko jeden. Każdy ma własne value (np. cenę lub kod), a zaznaczenie sprawdzasz przez checked, dokładnie jak w checkboxie. Różnica: zwykle nie interesuje cię każdy radio osobno, tylko ten jeden zaznaczony.

Dwa sposoby:

  1. Selektor :checked – document.querySelector('input[name="papier"]:checked') zwraca zaznaczony element albo null, jeśli nic nie zaznaczono.
  2. Pętla po document.querySelectorAll('input[name="papier"]') albo po getElementsByName('papier') i sprawdzanie checked.
Sprawdź się

Żaden przycisk w grupie name='papier' nie jest zaznaczony. Co zrobi ten kod?

var wybrany = document.querySelector('input[name="papier"]:checked');
document.getElementById('wynik').innerHTML = wybrany.value;
Cena wg wybranego radio
function policz() {
  // sposób 1: selektor :checked – zwraca zaznaczony element
  const wybrany = document.querySelector('input[name="papier"]:checked');
  const cenaZaSztuke = parseFloat(wybrany.value);
  const odbitki = parseInt(document.getElementById('odbitki').value);
  const koszt = cenaZaSztuke * odbitki;
  document.getElementById('wynik').innerHTML = 'Cena: ' + koszt.toFixed(2) + ' zł';
}

// sposób 2 (dialekt egzaminacyjny): pętla po grupie
function wybranaWartosc(nazwaGrupy) {
  var przyciski = document.getElementsByName(nazwaGrupy);
  for (var i = 0; i < przyciski.length; i++) {
    if (przyciski[i].checked) return przyciski[i].value;
  }
  return null;   // nic nie zaznaczono
}
console.log('Na start zaznaczono:', wybranaWartosc('papier'));
Podgląd

Jeśli arkusz podaje ceny w treści („laminowane 12 zł/m², winylowe 14 zł/m²”), możesz wpisać je jako value przycisków albo trzymać tylko nazwy w value i dobierać cenę w if/else lub z obiektu (ceny[wybrany.value]). Oba podejścia są oceniane tak samo – liczy się wynik.

Lista rozwijana (select)

Element <select> ma trzy przydatne właściwości:

WłaściwośćCo zwracaPrzykład dla wybranej opcji <option value="krk">Kraków</option>
select.valuevalue wybranej opcji (gdy opcja nie ma atrybutu value – jej tekst)"krk"
select.selectedIndexnumer wybranej opcji od 0 (-1, gdy nic nie wybrano)1
select.options[i].texttekst widoczny na liście"Kraków"

Najprostszy zapis to select.value. Gdy chcesz pokazać użytkownikowi widoczny tekst, a nie kod, użyj select.options[select.selectedIndex].text.

Sprawdź się

Co wypisze kod, gdy użytkownik wybrał drugą pozycję listy <select id='m'><option value='waw'>Warszawa</option><option value='gda'>Gdańsk</option></select>?

var lista = document.getElementById('m');
document.write(lista.value + ' ' + lista.selectedIndex);
Miasto z listy
document.getElementById('pokaz').addEventListener('click', () => {
  const miasto = document.getElementById('miasto');
  const dostawa = document.getElementById('dostawa');
  const kosztDostawy = parseFloat(dostawa.value);          // value to napis
  const nazwaDostawy = dostawa.options[dostawa.selectedIndex].text;
  document.getElementById('wynik').innerHTML =
    `Kurs odbędzie się w ${miasto.value} (pozycja ${miasto.selectedIndex + 1}).<br>` +
    `${nazwaDostawy}: ${kosztDostawy} zł`;
});
Podgląd

Jeśli opcje nie mają atrybutu value, select.value zwraca tekst opcji – to częsty przypadek w prostych formularzach (np. „lista rozwijana z miastami”), gdzie wystarczy <option>Warszawa</option>.

Pozostałe kontrolki

Pole wielowierszowe (textarea)

<textarea id="tresc"></textarea> odczytujesz jak zwykłe pole: tresc.value. Znaki nowej linii są w napisie jako \n; jeśli wypisujesz treść przez innerHTML, zamień je na <br>: tresc.value.replace(/\n/g, '<br>') albo nadaj akapitowi styl white-space: pre-line.

Suwak (range)

<input type="range" id="jasnosc" min="0" max="200" value="100"> zwraca aktualne położenie jako napis ("100"). Suwak nie ma stanu „pusty” – zawsze ma jakąś wartość. Często łączy się go ze zdarzeniem input, żeby reagować w trakcie przesuwania:

Suwak na żywo
const suwak = document.getElementById('krycie');
suwak.addEventListener('input', () => {
  const procent = suwak.valueAsNumber;            // od razu liczba
  document.getElementById('odczyt').textContent = procent;
  document.getElementById('probka').style.opacity = procent / 100;
});
Podgląd

Hasło, kolor, data

type="password" to zwykłe pole tekstowe z kropkami – value zwraca prawdziwy tekst. W zadaniu „porównaj dwa hasła” wystarczy haslo1.value === haslo2.value. Pole type="color" zwraca kolor w zapisie #rrggbb (np. "#ff0000"), a type="date" napis "2026-10-20" (rok-miesiąc-dzień, niezależnie od tego, jak wyświetla go przeglądarka).

Pole pliku (type=file) – C:\fakepath\

Od 2025 r. w arkuszach pojawia się pole <input type="file">. Jego value nie zawiera prawdziwej ścieżki – ze względów bezpieczeństwa każda przeglądarka zwraca napis C:\fakepath\ + nazwa pliku, np. "C:\fakepath\zdjecie.jpg" (bez wybranego pliku: ""). Stąd polecenie „ustal nazwę pliku bez ścieżki dostępu”. Masz dwa sposoby:

  1. Wyciąć nazwę z value – wszystko po ostatnim ukośniku wstecznym: sciezka.slice(sciezka.lastIndexOf('\\') + 1). W kodzie JS ukośnik wsteczny zapisujesz podwójnie, bo pojedynczy \ rozpoczyna znak specjalny.
  2. Odczytać files[0].name – właściwość files to lista wybranych plików; files[0] to pierwszy z nich, a .name to sama nazwa. Daje to też files[0].size (bajty) i files[0].type (np. "image/png").
Nazwa pliku bez ścieżki
document.getElementById('sprawdz').addEventListener('click', () => {
  const pole = document.getElementById('plik');
  const wynik = document.getElementById('wynik');
  if (pole.files.length === 0) {
    wynik.textContent = 'Nie wybrano pliku.';
    return;
  }
  const sciezka = pole.value;                                   // "C:\fakepath\kot.png"
  const nazwaZeSciezki = sciezka.slice(sciezka.lastIndexOf('\\') + 1);   // "kot.png"
  const nazwaZFiles = pole.files[0].name;                       // "kot.png"
  wynik.innerHTML = 'value: ' + sciezka + '<br>' +
    'slice po ostatnim \\: ' + nazwaZeSciezki + '<br>' +
    'files[0].name: ' + nazwaZFiles + '<br>' +
    'rozmiar: ' + pole.files[0].size + ' B';
});
Podgląd

Dwa style zapisu: egzaminacyjny i nowoczesny

W arkuszach i tabelach pomocniczych CKE kod wygląda tak: atrybut onclick="funkcja()", var, getElementById, innerHTML. Ty możesz pisać nowocześniej – const, addEventListener, querySelector, textContent. Oba style są na egzaminie w pełni poprawne – egzaminator sprawdza efekt w przeglądarce i obecność konstrukcji w kodzie, nie wersję języka. Umiej czytać i pisać oba; w lekcji 14 porównamy je dokładnie na pełnym zadaniu.

dwa-style.js
// dialekt egzaminacyjny
function pokaz() {
  var imie = document.getElementById('imie').value;
  document.getElementById('wynik').innerHTML = 'Witaj, ' + imie;
}
// w HTML: <button onclick="pokaz()">Pokaż</button>

// styl nowoczesny
document.querySelector('#pokaz').addEventListener('click', () => {
  const imie = document.querySelector('#imie').value;
  document.querySelector('#wynik').textContent = `Witaj, ${imie}`;
});

Reagowanie na zmianę kontrolki

Nie zawsze trzeba czekać na przycisk. Zdarzenie change uruchamia się, gdy użytkownik zakończy zmianę (odznaczy checkbox, wybierze opcję, opuści pole tekstowe), a input – przy każdej zmianie wartości (każdy wpisany znak, każdy ruch suwaka). Zdarzenia focus/blur (wejście i wyjście z pola) znasz z lekcji 12 – arkusz z czerwca 2024 (INF.03-08-24.06) kazał zwiększać pasek postępu właśnie po opuszczeniu każdego pola.

Zmiana bez przycisku
const faktura = document.getElementById('faktura');
const daneFirmy = document.getElementById('daneFirmy');
faktura.addEventListener('change', () => {
  daneFirmy.style.display = faktura.checked ? 'block' : 'none';
});

const nip = document.getElementById('nip');
nip.addEventListener('input', () => {
  document.getElementById('licznik').textContent = nip.value.length + '/10';
});
Podgląd

Na egzaminie

Ściąga

Kontrolka / zapisCo zwracaPrzykład
pole.valuezawartość jako napis (text, number, password, textarea, range, color, date)parseFloat(pole.value)
pole.valueAsNumberliczba (NaN, gdy puste); tylko number/range/dateconst n = pole.valueAsNumber;
pole.value = '...'wpisuje tekst do pola; '' czyścipole.value = '';
checkbox.checkedtrue/falseif (zgoda.checked) suma += 30;
checkbox.valuenapis z atrybutu, niezależnie od zaznaczenia (domyślnie "on")parseFloat(pole.value) w pętli po :checked
querySelector('input[name="g"]:checked')zaznaczony radio z grupy lub nullwybrany.value
querySelectorAll('.zabieg:checked')kolekcja zaznaczonych pólfor (const p of zaznaczone)
getElementsByName('g')kolekcja całej grupy (pętla + checked)przyciski[i].checked
select.valuevalue wybranej opcji (lub jej tekst, gdy brak value)miasto.value
select.selectedIndexnumer wybranej opcji od 0lista.options[lista.selectedIndex].text
plik.value"C:\fakepath\nazwa.png" lub ""v.slice(v.lastIndexOf('\\') + 1)
plik.files[0].namesama nazwa pierwszego plikuplik.files[0].name
change / inputzdarzenie po zakończeniu zmiany / przy każdej zmianiepole.addEventListener('input', fn)

Zadania

Zadanie 1
łatwe

Pokaż wszystko

Zbuduj formularz z pięcioma kontrolkami: pole tekstowe „Imię”, pole liczbowe „Wiek”, checkbox „Newsletter”, grupa dwóch radio „Płeć” (K/M, jedno domyślnie zaznaczone) i lista rozwijana „Klasa” (1–4). Pod przyciskiem Pokaż w akapicie id="wynik" wypisz każdą wartość z etykietą, każdą w osobnej linii, np.:

Tekst
Imię: Ola
Wiek: 17 (za rok: 18)
Newsletter: tak
Płeć: K
Klasa: 3

Wiek „za rok” ma być liczbą o 1 większą (nie 171!).

Pokaż rozwiązanie
Rozwiązanie: Pokaż wszystko
document.getElementById('pokaz').addEventListener('click', () => {
  const imie = document.getElementById('imie').value;
  const wiek = parseInt(document.getElementById('wiek').value);      // liczba, nie napis
  const newsletter = document.getElementById('newsletter').checked ? 'tak' : 'nie';
  const plec = document.querySelector('input[name="plec"]:checked').value;
  const klasa = document.getElementById('klasa').value;               // brak atrybutu value → tekst opcji

  document.getElementById('wynik').innerHTML =
    'Imię: ' + imie + '<br>' +
    'Wiek: ' + wiek + ' (za rok: ' + (wiek + 1) + ')<br>' +
    'Newsletter: ' + newsletter + '<br>' +
    'Płeć: ' + plec + '<br>' +
    'Klasa: ' + klasa;
});
Podgląd
Zadanie 2
średnie

Bilet do kina

Formularz: grupa radio „Rodzaj biletu” – normalny 28 zł, ulgowy 19 zł, rodzinny 70 zł (normalny domyślnie zaznaczony); pole liczbowe „Liczba biletów” (min="1", domyślnie 1); checkbox „Okulary 3D (+5 zł do każdego biletu)”; przycisk Oblicz. Pod przyciskiem wypisz: Do zapłaty: <kwota> zł – kwota to cena biletu (plus 5 zł, jeśli okulary) razy liczba biletów. Przetestuj dla dwóch zestawów danych: (ulgowy, 3, bez okularów) = 57 zł oraz (rodzinny, 2, z okularami) = 150 zł.

Pokaż rozwiązanie
Rozwiązanie: Bilet do kina
function obliczKwote() {
  const wybranyBilet = document.querySelector('input[name="bilet"]:checked');
  let cenaBiletu = parseFloat(wybranyBilet.value);
  const liczbaBiletow = parseInt(document.getElementById('liczba').value);
  if (document.getElementById('okulary').checked) {
    cenaBiletu += 5;                       // dopłata do KAŻDEGO biletu
  }
  const doZaplaty = cenaBiletu * liczbaBiletow;
  document.getElementById('wynik').innerHTML = 'Do zapłaty: ' + doZaplaty + ' zł';
}
Podgląd
Zadanie 3
średniejak na INF.03

Myjnia samochodowa

Na stronie cennik.html znajduje się formularz (bez znacznika <form> lub z przyciskiem type="button"):

  • cztery pola wyboru z etykietami: „Mycie zewnętrzne – 35 zł”, „Odkurzanie – 20 zł”, „Woskowanie – 50 zł”, „Pranie tapicerki – 90 zł”,
  • lista rozwijana „Rozmiar auta” z pozycjami: „Osobowe” i „SUV / van”,
  • przycisk „Oblicz”,
  • pod przyciskiem pusty akapit.

Skrypt napisany w JavaScript, uruchamiany przyciskiem, sumuje ceny zaznaczonych usług, a dla auta „SUV / van” zwiększa sumę o 20 %. W pustym akapicie wypisuje: Rozmiar: <rozmiar>. Do zapłaty: <kwota> zł – np. Rozmiar: SUV / van. Do zapłaty: 66 zł dla mycia i odkurzania. Stosuj znaczące nazwy zmiennych i funkcji.

Kryteria samooceny (0/1):

  1. Skrypt w JavaScript, zawiera co najmniej jedną poprawną składniowo instrukcję; funkcja wywoływana przyciskiem „Oblicz”.
  2. Skrypt pobiera dane z co najmniej jednej kontrolki (np. document.getElementById).
  3. Suma uwzględnia każde z czterech pól wyboru – zaznaczenie każdego jest testowane.
  4. Dla „SUV / van” kwota jest o 20 % większa; dla „Osobowe” bez zmian – sprawdzane dla obu pozycji listy.
  5. Wynik zawiera nazwę rozmiaru z listy i kwotę w dokładnie podanym formacie, w akapicie pod przyciskiem.
  6. Nazwy zmiennych i funkcji znaczące (PL lub EN).
Pokaż rozwiązanie
Rozwiązanie: Myjnia samochodowa
function obliczKoszt() {
  // kryterium 3: każde pole osobno
  let suma = 0;
  if (document.getElementById('mycie').checked) suma += 35;
  if (document.getElementById('odkurzanie').checked) suma += 20;
  if (document.getElementById('woskowanie').checked) suma += 50;
  if (document.getElementById('tapicerka').checked) suma += 90;

  // kryterium 4: dopłata zależna od listy
  const rozmiar = document.getElementById('rozmiar').value;   // tekst opcji (brak atrybutu value)
  if (rozmiar === 'SUV / van') {
    suma = suma * 1.2;
  }

  // kryterium 5: dokładny format
  document.getElementById('wynik').innerHTML =
    'Rozmiar: ' + rozmiar + '. Do zapłaty: ' + suma + ' zł';
}
Podgląd

Test: Osobowe + mycie + odkurzanie = 55 zł; SUV / van + te same usługi = 66 zł. Zmień dane i sprawdź jeszcze raz.

Zadanie 4
trudnejak na INF.03

Drukarnia – pozycja zamówienia

Strona zamowienie.html zawiera: pole wyboru pliku (accept="image/*"), pole liczbowe „Liczba kopii” (domyślnie 1), grupę radio „Format”: „A4 – 2 zł” (domyślnie zaznaczony) i „A3 – 3,50 zł”, pole tekstowe „Uwagi” (textarea), przycisk „Dodaj do zamówienia” oraz pusty akapit pod przyciskiem.

Skrypt po kliknięciu:

  1. ustala nazwę pliku bez ścieżki dostępu; gdy plik nie został wybrany, wypisuje Wybierz plik. i kończy działanie;
  2. oblicza cenę: cena formatu razy liczba kopii;
  3. wypisuje w akapicie, w trzech liniach: Plik: <nazwa>, Kopie: <liczba>, format <A4/A3>, Cena: <kwota> zł, a w czwartej linii uwagi – tylko jeśli pole uwag nie jest puste.

Do testu wybierz dowolny obraz z dysku (żadne dane nie są nigdzie wysyłane).

Pokaż rozwiązanie
Rozwiązanie: Drukarnia
document.getElementById('dodaj').addEventListener('click', () => {
  const polePliku = document.getElementById('plik');
  const wynik = document.getElementById('wynik');

  // 1. nazwa pliku bez ścieżki
  if (polePliku.files.length === 0) {
    wynik.textContent = 'Wybierz plik.';
    return;
  }
  const sciezka = polePliku.value;                                 // "C:\fakepath\kot.png"
  const nazwaPliku = sciezka.slice(sciezka.lastIndexOf('\\') + 1); // "kot.png"
  // równoważnie: const nazwaPliku = polePliku.files[0].name;

  // 2. cena
  const kopie = parseInt(document.getElementById('kopie').value);
  const wybranyFormat = document.querySelector('input[name="format"]:checked');
  const cenaFormatu = parseFloat(wybranyFormat.value);
  const nazwaFormatu = wybranyFormat.id.toUpperCase();              // "a4" → "A4"
  const cena = cenaFormatu * kopie;

  // 3. wynik w trzech (lub czterech) liniach
  let tekst = 'Plik: ' + nazwaPliku + '<br>' +
    'Kopie: ' + kopie + ', format ' + nazwaFormatu + '<br>' +
    'Cena: ' + cena + ' zł';
  const uwagi = document.getElementById('uwagi').value.trim();
  if (uwagi !== '') {
    tekst += '<br>Uwagi: ' + uwagi;
  }
  wynik.innerHTML = tekst;
});
Podgląd

Test powtórkowy

Test powtórkowy

Format jak w części pisemnej INF.03 – 4 odpowiedzi, 1 poprawna.

0/0poprawnych
Sprawdź się

Która właściwość zwraca tekst wpisany przez użytkownika w pole <input type='text' id='imie'>?

Sprawdź się

Jakiego typu jest zmienna x po wykonaniu kodu, gdy w polu liczbowym wpisano 7?

var x = document.getElementById('ile').value;
Sprawdź się

Który zapis sprawdza, czy pole wyboru o id zgoda jest zaznaczone?

Sprawdź się

Użytkownik wybrał trzecią pozycję listy <select id='l'>. Jaką wartość ma document.getElementById('l').selectedIndex?

Sprawdź się

Co zawiera value pola <input type='file'> po wybraniu pliku zdjecie.jpg z pulpitu?

Sprawdź się

Które wyrażenie zwraca zaznaczony przycisk opcji z grupy name='rozmiar' (lub null, gdy brak)?

Sprawdź się

W polach wpisano 10 i 20. Który kod wypisze 30?

Sprawdź się

Pole <input type='number' id='n'> jest puste. Które wyrażenie zwróci 0, a nie NaN?

Sprawdź się

Które zdarzenie uruchomi się przy każdym ruchu suwaka type='range', jeszcze przed jego puszczeniem?

Sprawdź się

Fragment w dialekcie egzaminacyjnym ma wyczyścić pole tekstowe po dodaniu pozycji. Który zapis jest poprawny?