← Lekcje
JavaScript · lekcja 17

Funkcje w JavaScript 2/4:
funkcja wywołana przez przycisk

Plan tematu (4 godziny):

  1. Godzina 1: własna funkcja - definicja, parametry, return
  2. Godzina 2 (dziś): funkcja wywołana przez przycisk
  3. Godzina 3: co widzi funkcja - zmienne lokalne
  4. Godzina 4: parseFloat, Math - powtórka
Rozgrzewka · 3 minuty

Rozgrzewka: funkcje z poprzedniej lekcji

  1. Od jakiego słowa zaczyna się definicja własnej funkcji w JavaScript?
  2. Co wpisujecie w nawiasy okrągłe zaraz po nazwie funkcji?
  3. Do czego służy słowo return wewnątrz funkcji?
Część 1 · Planowanie funkcji

Zanim napiszecie kod: co wchodzi, co robi, co wychodzi

Zanim zaczniecie pisać funkcję, warto rozpisać ją na trzy pytania: co funkcja dostaje (parametry), co z tym robi (kod w środku) i co po sobie zostawia (wynik). To ten sam schemat „maszynki”, co przy funkcjach w PHP.

WEJŚCIE parametry number1, number2 CO ROBI ciało funkcji total = number1 + number2 WYJŚCIE wynik console.log(total)
MDN: Learn_web_development/Core/Scripting/Build_your_own_function, sekcja „The basic function” („We start off with the keyword function... Any parameters we want to give to our function go inside the parentheses, and the code that runs when we call the function goes inside the curly braces”)
Część 2 · Przycisk wywołuje funkcję

onclick: przycisk HTML wywołujący funkcję

przycisk „Dodaj” <button onclick="add()"> atrybut onclick wywołuje kod z cudzysłowu funkcja add() wykonuje się od góry do dołu klik
<button onclick="add()">Dodaj</button>

Atrybut onclick w znaczniku HTML to najprostszy sposób podpięcia funkcji pod kliknięcie. Nie musicie nic robić w pliku script.js poza napisaniem samej funkcji add() - przeglądarka sama ją wywoła po kliknięciu.

CKE, E.14, wrzesień 2015, zadanie 35 · MDN: Learn_web_development/Core/Scripting/Build_your_own_function, sekcja „Calling the function”
Część 3 · Przykład: dodajemy dwie liczby

Od pól formularza do wyniku w konsoli

page.html:

Pierwsza liczba: <input type="text" id="number1">
Druga liczba: <input type="text" id="number2">
<button onclick="add()">Dodaj</button>

script.js:

function add() {
  const number1 = parseFloat(document.getElementById("number1").value);
  const number2 = parseFloat(document.getElementById("number2").value);
  const total = number1 + number2;
  console.log(total);
}

document.getElementById("number1") znajduje pole po jego id i pobiera to, co ktoś w nie wpisał (.value). parseFloat zamienia tekst z pola na liczbę - bez tego "3" + "4" dałoby tekst "34", nie liczbę 7.

Ciekawostka z MDN: znak + w JavaScripcie potrafi sklejać teksty, nie tylko dodawać liczby. Gdy choć jedna strona jest tekstem, druga też zamienia się w tekst - dlatego "2" + 2 daje tekst "22", a nie liczbę 4.

Wzorzec pól i przycisku: CKE E.14 wrzesień 2015 zad. 35 (bank pytań) · parseFloat - MDN Reference/Global_Objects/parseFloat
Część 4 · Ta sama funkcja, dwa różne wywołania

Wartość bezwzględna: liczba ujemna staje się dodatnia

absoluteValue(-7) absoluteValue(7) funkcja absoluteValue 0 -7 7 odbicie: -7 → 7
function absoluteValue(number) {
  if (number < 0) {
    number = number * -1;
  }
  return number;
}

Jedna definicja funkcji, dwa przyciski z różnym argumentem: <button onclick="absoluteValue(-7)"> i <button onclick="absoluteValue(7)">. Dla liczby ujemnej funkcja ją odwraca, dla dodatniej zostawia bez zmian - w obu przypadkach wynik to 7. To się nazywa wartość bezwzględna.

Wzór funkcji zgodny z CKE E.14 styczeń 2017 zad. 35 (slajd „Tak pytają na egzaminie”, tam pod nazwą fun1)
Egzamin E.14

Tak pytają na egzaminie

1.

Fragment kodu w języku JavaScript realizujący dodawanie dwóch liczb ma następującą postać:

Podaj pierwszą liczbę: <input type="text" name="liczba1" />
Podaj drugą liczbę: <input type="text" name="liczba2" />
...
<script type=text/javascript>
function dodaj() {
  // ta funkcja realizuje dodawanie
  // i podaje jego wynik
}
</script>

Aby dodawanie wykonane było po kliknięciu przycisku o nazwie „dodaj”, należy w wykropkowane miejsce wstawić

  1. <button onselect="return dodaj()">dodaj</button>
  2. <button onselect="return dodaj()">oblicz</button>
  3. <button onclick="return oblicz()">dodaj</button>
  4. <button onclick="return dodaj()">dodaj</button>

2.

W języku JavaScript zapisano funkcję.

function fun1(f) {
  if (f < 0) f = f * (-1);
  return f
}

Ma ona za zadanie

  1. wypisać wartość odwrotną do f.
  2. zwrócić wartość odwrotną do f.
  3. wypisać wartość bezwzględną z f.
  4. zwrócić wartość bezwzględną z f.
CKE, E.14, wrzesień 2015, zadanie 35 · CKE, E.14, styczeń 2017, zadanie 35
Ćwiczenie przy komputerze · 20 minut

Ćwiczenie: przycisk „Dodaj”

  1. Otwórz page.html z poprzednich lekcji (w folderze swojego projektu).
  2. Dodaj dwa pola tekstowe o id="number1" i id="number2" oraz przycisk <button onclick="add()">Dodaj</button>.
  3. W script.js napisz function add(), która odczyta oba pola (document.getElementById(...).value, zamienione przez parseFloat) i wypisze ich sumę w konsoli (console.log).
  4. Sprawdźcie w przeglądarce (F12, konsola): wpiszcie dwie liczby, kliknijcie „Dodaj”, sprawdźcie wynik.
  5. Dla chętnych w domu: dodaj drugi przycisk „Odejmij” i funkcję subtract() działającą na tych samych polach.
Na koniec

Sprawdź się

  1. Co wpisujecie w atrybut onclick znacznika <button>, żeby kliknięcie wywołało waszą funkcję?
  2. Do czego służy document.getElementById("number1") w funkcji add()?
  3. Dlaczego jedna funkcja absoluteValue(number) daje wynik 7 zarówno dla -7, jak i dla 7?

To tyle na dziś - kolejny temat: co widzi funkcja, czyli zmienne lokalne.

Poza szkołą

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
Atrybut onclick w HTMLaddEventListener("click", ...) w pliku JSzastępowane
getElementById("number1").valueFrameworki (React, Vue) same synchronizują pole ze zmienną.rozszerzane
function add() {...}Funkcja strzałkowa: const add = () => {...}rozszerzane
Wynik w console.logWynik na stronie (zmiana treści elementu) - dział DOM, lekcje 21–25.zastępowane
MDN: Learn_web_development/Core/Scripting/Events („As we saw in the last example, objects that can fire events have an addEventListener() method, and this is the recommended mechanism for adding event listeners”, „you shouldn't use these [inline event handler attributes] - they are considered bad practice”)