← Lekcje
JavaScript · lekcja 25

DOM 6/6:
powtórka - łączymy wyszukiwanie, zmianę i tworzenie

Plan tematu (6 godzin):

  1. Godzina 1: DOM (ang. Document Object Model, obiektowy model dokumentu) - strona jako drzewo obiektów
  2. Godzina 2: znajdujemy element na stronie
  3. Godzina 3: zmieniamy tekst i wygląd elementu
  4. Godzina 4: podmieniamy atrybut - src, class
  5. Godzina 5: dodajemy nowy element na stronę
  6. Godzina 6 (dziś): powtórka - łączymy wyszukiwanie, zmianę i tworzenie
Rozgrzewka · 4 minuty

Rozgrzewka: cztery metody z poprzednich lekcji

  1. Co zwraca document.getElementById("nazwa"), jeśli w dokumencie nie ma elementu o takim id?
  2. Którą właściwość elementu zmieniacie, żeby podmienić całą jego zawartość na nowy tekst?
  3. Którą metodą zmieniacie atrybut elementu, na przykład src obrazka?
  4. Którą metodą tworzycie zupełnie nowy element, którego wcześniej nie było w dokumencie?
Część 1 · Cała podróż przez DOM

Mapa tematu: DOM od znalezienia do zmiany

Pięć poprzednich godzin nauczyło Was czterech kroków pracy z DOM (ang. Document Object Model, obiektowy model dokumentu). Każdy kolejny krok korzysta z poprzedniego - najpierw trzeba element znaleźć, dopiero potem można go zmienić, podmienić mu atrybut albo usunąć.

1. Znajdź getElementById getElementsBy- ClassName godziny 1-2 2. Zmień treść/styl innerHTML style.color godzina 3 3. Zmień atrybut setAttribute getAttribute godzina 4 4. Utwórz/usuń createElement appendChild remove godzina 5

Ciekawostka z MDN: metoda remove() z ostatniego kafelka mapy nie działała w przeglądarkach od zawsze - stała się dostępna we wszystkich głównych przeglądarkach dopiero w lipcu 2015 roku. Dziś definiuje ją standard DOM prowadzony przez WHATWG (ang. Web Hypertext Application Technology Working Group).

MDN, Learn_web_development/Core/Scripting/DOM_scripting: „When writing web pages and apps, one of the most common things you'll want to do is change the document structure in some way... In this article we'll introduce you to DOM scripting.” - „Podczas pisania stron i aplikacji internetowych jedną z najczęstszych rzeczy, które chcecie zrobić, jest zmiana struktury dokumentu w jakiś sposób... W tym artykule wprowadzimy Was w DOM scripting (skryptowanie DOM).” (tłum. własne)
Część 2 · Cel dzisiejszego ćwiczenia

Jedna strona, trzy interaktywne elementy

Dziś nie uczycie się niczego nowego - łączycie na jednej stronie trzy osobne kawałki z godzin 3-5 tego tematu. Każdy przycisk wywołuje inną, już napisaną funkcję.

page.html img id="photo" Zamień obrazek swapImage() p id="info" Stary tekst Pomaluj na czerwono paintRed() ul id="tasks" • Pierwsze zadanie Dodaj zadanie addItem()
Rozwiązanie - znaczniki HTML
<img id="photo" src="image-a.svg" alt="Ilustracja A">
<button type="button" onclick="swapImage()">Zamień obrazek</button>
<p id="info">Stary tekst</p>
<button type="button" onclick="paintRed()">Pomaluj na czerwono</button>
<ul id="tasks"><li>Pierwsze zadanie</li></ul>
<button type="button" onclick="addItem()">Dodaj zadanie</button>
Rozwiązanie - funkcje JavaScript
function swapImage() {
  const picture = document.getElementById("photo");
  picture.setAttribute("src", "image-b.svg");
}
function paintRed() {
  const paragraph = document.getElementById("info");
  paragraph.style.color = "red";
}
function addItem() {
  const list = document.getElementById("tasks");
  const newItem = document.createElement("li");
  newItem.textContent = "Nowe zadanie";
  list.appendChild(newItem);
}
Część 3 · Co łączy te trzy przyciski

Zdarzenie → funkcja → zmiana w DOM

Za każdym z trzech przycisków stoi ten sam schemat: zdarzenie (ang. event, sygnał, że coś się wydarzyło na stronie, np. kliknięcie) uruchamia funkcję, a funkcja zmienia DOM. Dziś zdarzenie „kliknięcie” obsługuje atrybut onclick w HTML - na kolejnym temacie poznacie addEventListener(), sposób zalecany w produkcji.

Zdarzenie kliknięcie przycisku „Pomaluj na czerwono” Funkcja onclick="paintRed()" funkcja w script.js Zmiana w DOM paragraph.style.color = "red"
MDN, Learn_web_development/Core/Scripting/DOM_scripting, podsumowanie: „We have reached the end of our study of document and DOM manipulation... Most importantly, you should understand what the Document Object Model is, and how to manipulate it to create useful functionality.” - „Doszliśmy do końca naszej nauki o dokumencie i manipulacji DOM... Przede wszystkim powinniście rozumieć, czym jest obiektowy model dokumentu (Document Object Model) i jak go zmieniać, żeby tworzyć użyteczną funkcjonalność.” (tłum. własne)
Część 4 · Biblioteki JavaScriptu

Ten sam kod krócej: biblioteka jQuery

Biblioteka to gotowy zbiór funkcji, który ktoś napisał przed Wami i udostępnił do pobrania: dołączacie do strony jeden plik i piszecie mniej kodu, tak jak kucharz otwiera gotowy bulion zamiast gotować go od zera. Najbardziej znana biblioteka JavaScriptu to jQuery, większe zestawy narzędzi to Angular i React. Dziś nic nie instalujemy, pokazuję tylko dwa zapisy obok siebie.

czysty JavaScript (to, co umiecie) document.getElementById("info") .textContent = "Nowy tekst"; dwie linie, nic nie dołączamy jQuery (biblioteka) $("#info").text("Nowy tekst"); jedna linia, ale trzeba dołączyć plik biblioteki $( ) to druga nazwa jQuery( ), a pod spodem jQuery woła document.getElementById()
api.jquery.com, id-selector: „Calling jQuery() (or $()) with an id selector as its argument will return a jQuery object containing a collection of either zero or one DOM element.”, „For id selectors, jQuery uses the JavaScript function document.getElementById(), which is extremely efficient.” (tłum. własne: „Wywołanie jQuery() (albo $()) z selektorem id zwraca obiekt jQuery z zerem albo jednym elementem DOM”, „Dla selektorów id jQuery używa funkcji JavaScriptu document.getElementById(), która jest bardzo wydajna”) · api.jquery.com, text: „.text( text )” ustawia treść tekstową dopasowanych elementów · Podstawa programowa technik informatyk 351203, INF.03.5(3), kryterium 7: „korzysta z bibliotek i frameworków języka JavaScript, w tym z biblioteki jQuery, Angular, React”
Egzamin EE.09 / E.14

Tak pytają na egzaminie

1.

<img src="image1.png">
<img src="image2.png" id="id1">
<button onclick="document.getElementById('id1')
  .style.display='none'">Przycisk</button>

Przedstawiony fragment dokumentu HTML z kodem JavaScript spowoduje, że po wciśnięciu przycisku

  1. image1.png zostanie ukryty.
  2. image2.png zostanie ukryty.
  3. image2.png zostanie zastąpiony przez image1.png
  4. image1.png zostanie zastąpiony przez image2.png

2.

<p id="para1">Przykładowy tekst</p>
<p> i skrypt</p>
<button onClick="changeColor('blue');">
  niebieski</button>
<script>
function changeColor(newColor) {
  var elem = document.getElementById("para1");
  elem.style.color = newColor;
}
</script>

Wciśnięcie przycisku „niebieski” spowoduje wykonanie przedstawionego kodu. Jaki będzie efekt jego działania?

  1. Zmiana koloru przycisku na niebieski.
  2. Zmiana koloru tekstu „i skrypt” na niebieski.
  3. Zmiana koloru tekstu „Przykładowy tekst” na niebieski.
  4. Zmiana koloru tekstu „Przykładowy tekst i skrypt” na niebieski.
CKE, EE.09, styczeń 2020, zadanie 36 · CKE, E.14, styczeń 2019, zadanie 40
Część 5 · Trzy gotowe funkcje z poprzednich lekcji

Przypomnienie: funkcje, które dziś połączycie

script.js (fragmenty z godzin 3-5 tego tematu):

function paintRed() {
  const paragraph = document.getElementById("info");
  paragraph.style.color = "red";
}

function swapImage() {
  const picture = document.getElementById("photo");
  picture.setAttribute("src", "image-b.svg");
}

function addItem() {
  const list = document.getElementById("tasks");
  const newItem = document.createElement("li");
  newItem.textContent = "Nowe zadanie";
  list.appendChild(newItem);
}
Ćwiczenie przy komputerze · 20 minut

Ćwiczenie: łączymy trzy przyciski na jednej stronie

  1. Otwórz page.html z poprzednich lekcji. Sprawdź, że jest w nim: akapit id="info" z przyciskiem onclick="paintRed()", obrazek id="photo" z przyciskiem onclick="swapImage()", lista id="tasks" z przyciskiem onclick="addItem()". Jeśli któregoś elementu brakuje, dopisz go teraz.
  2. Sprawdź w script.js, że wszystkie trzy funkcje (paintRed, swapImage, addItem) są zapisane - jeśli którejś brakuje, przepisz ją z poprzedniego slajdu.
  3. Otwórz page.html w przeglądarce i kliknij po kolei wszystkie trzy przyciski - kolor akapitu, obrazek i lista mają się zmieniać niezależnie od siebie.
  4. Zapisz oba pliki - wrócicie do nich na następnej lekcji, przy zdarzeniach.
Na koniec

Sprawdź się

  1. Jakie są cztery kroki pracy z elementem w DOM, od znalezienia do usunięcia?
  2. Czym różni się zmiana atrybutu przez setAttribute od zmiany treści przez innerHTML?
  3. Jaki wspólny schemat stoi za każdym z trzech przycisków z dzisiejszego ćwiczenia?

To tyle na dziś - temat DOM zamknięty, kolejny temat to zdarzenia.

Poza szkołą

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
Atrybut onclick wpisany w HTMLaddEventListener() w osobnym pliku JS - oddziela znaczniki HTML od logiki, można podpiąć wiele funkcji pod jedno zdarzeniezastępowane
Cztery osobne metody DOM wywoływane ręcznieFrameworki (React, Vue) same przerysowują cały wygląd strony na podstawie stanu aplikacji - programista rzadko woła createElement wprostrozszerzane
Jedna strona z trzema prostymi elementamiW dużej aplikacji zmienia się jednocześnie setki elementów - surowe DOM API (te same cztery metody z dzisiejszej mapy) działa pod spodem każdej bibliotekinadal w użyciu
innerHTML do wstawiania tekstuTekst od użytkownika wstawia się przez textContent, nie innerHTML - ryzyko ataku XSSunikane (dla danych od użytkownika)
wiersz o innerHTML/XSS: MDN, Web/API/Node/textContent (cytat w lekcji 52)