DOM 6/6: powtórka - łączymy wyszukiwanie, zmianę i tworzenie
Plan tematu (6 godzin):
Godzina 1: DOM (ang. Document Object Model, obiektowy model dokumentu) - strona jako drzewo obiektów
Godzina 2: znajdujemy element na stronie
Godzina 3: zmieniamy tekst i wygląd elementu
Godzina 4: podmieniamy atrybut - src, class
Godzina 5: dodajemy nowy element na stronę
Godzina 6 (dziś): powtórka - łączymy wyszukiwanie, zmianę i tworzenie
Rozgrzewka · 4 minuty
Rozgrzewka: cztery metody z poprzednich lekcji
Co zwraca document.getElementById("nazwa"), jeśli w dokumencie nie ma elementu o takim id?
Którą właściwość elementu zmieniacie, żeby podmienić całą jego zawartość na nowy tekst?
Którą metodą zmieniacie atrybut elementu, na przykład src obrazka?
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ąć.
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ę.
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.
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.
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”
Przedstawiony fragment dokumentu HTML z kodem JavaScript spowoduje, że po wciśnięciu przycisku
image1.png zostanie ukryty.
image2.png zostanie ukryty.
image2.png zostanie zastąpiony przez image1.png
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?
Zmiana koloru przycisku na niebieski.
Zmiana koloru tekstu „i skrypt” na niebieski.
Zmiana koloru tekstu „Przykładowy tekst” na niebieski.
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
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.
Sprawdź w script.js, że wszystkie trzy funkcje (paintRed, swapImage, addItem) są zapisane - jeśli którejś brakuje, przepisz ją z poprzedniego slajdu.
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.
Zapisz oba pliki - wrócicie do nich na następnej lekcji, przy zdarzeniach.
Na koniec
Sprawdź się
Jakie są cztery kroki pracy z elementem w DOM, od znalezienia do usunięcia?
Czym różni się zmiana atrybutu przez setAttribute od zmiany treści przez innerHTML?
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 lekcji
W produkcji
Status
Atrybut onclick wpisany w HTML
addEventListener() w osobnym pliku JS - oddziela znaczniki HTML od logiki, można podpiąć wiele funkcji pod jedno zdarzenie
zastępowane
Cztery osobne metody DOM wywoływane ręcznie
Frameworki (React, Vue) same przerysowują cały wygląd strony na podstawie stanu aplikacji - programista rzadko woła createElement wprost
rozszerzane
Jedna strona z trzema prostymi elementami
W 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 biblioteki
nadal w użyciu
innerHTML do wstawiania tekstu
Tekst od użytkownika wstawia się przez textContent, nie innerHTML - ryzyko ataku XSS
unikane (dla danych od użytkownika)
wiersz o innerHTML/XSS: MDN, Web/API/Node/textContent (cytat w lekcji 52)