← Lekcje
JavaScript · lekcja 21

DOM 2/6:
znajdujemy element na stronie

Plan tematu (6 godzin):

  1. Godzina 1: DOM (obiektowy model dokumentu) - strona jako drzewo obiektów
  2. Godzina 2 (dziś): znajdujemy element na stronie
  3. Godziny 3-4: zmieniamy tekst, wygląd i atrybuty elementu
  4. Godziny 5-6: dodajemy nowy element, powtórka całego tematu
Rozgrzewka · 3 minuty

Rozgrzewka: DOM z poprzedniej lekcji

  1. Jak rozwija się skrót DOM?
  2. Co zwraca polecenie document wpisane w konsoli przeglądarki?
  3. Co zobaczycie po wpisaniu document.body?
Część 1 · Szukamy elementu po id

getElementById: jeden element o podanym id

Atrybut id opisuje jeden konkretny element na stronie - w całym dokumencie może wystąpić tylko raz. Metoda document.getElementById("title") znajduje ten element i zwraca go jako obiekt, na którym możecie dalej pracować.

document.getElementById("title")
html body h1 id="title" p p getElementById("title")

Jeśli w dokumencie nie ma elementu z takim id, metoda nie zgłasza błędu - zwraca null (pustą wartość, brak elementu).

Ciekawostka z MDN: ta metoda ma pułapkę w pisowni. Poprawnie jest getElementById (małe „d” na końcu) - zapis getElementByID z dużym „ID” wygląda naturalnie, ale nie zadziała.

MDN, Web/API/Document/getElementById: „The getElementById() method of the Document interface returns an Element object representing the element whose id property matches the specified string.” - „Metoda getElementById() interfejsu Document zwraca obiekt Element reprezentujący element, którego właściwość id jest zgodna z podanym ciągiem znaków.” (tłum. własne) · o null: „An Element object describing the DOM element object matching the specified ID, or null if no matching element was found in the document.” - „Obiekt Element opisujący element DOM pasujący do podanego id, albo null, jeśli w dokumencie nie znaleziono pasującego elementu.” (tłum. własne)
Część 2 · Szukamy elementów po class

getElementsByClassName: wszystkie elementy z daną klasą

Tę samą klasę (atrybut class) może mieć naraz wiele elementów. Metoda document.getElementsByClassName("item") zwraca kolekcję - listę wszystkich elementów z klasą item, ile by ich nie było.

document.getElementsByClassName("item")
html body p class="item" p class="item" p class="item" getElementsByClassName("item")

Ta kolekcja nazywa się HTMLCollection (kolekcja elementów HTML) i jest żywa - sama się aktualizuje. Gdy dodacie albo usuniecie element z klasą item, kolekcja zmieni się automatycznie, bez ponownego wywoływania metody.

MDN, Web/API/Document/getElementsByClassName: „The getElementsByClassName method of Document interface returns an array-like object of all child elements which have all of the given class name(s).” - „Metoda getElementsByClassName interfejsu Document zwraca zbioropodobny obiekt (ang. array-like object) wszystkich elementów potomnych, które mają wszystkie podane nazwy klas.” (tłum. własne) · o żywej kolekcji: „Warning: This is a live HTMLCollection. Changes in the DOM will reflect in the array as the changes occur. If an element selected by this array no longer qualifies for the selector, it will automatically be removed. Be aware of this for iteration purposes.” - „Uwaga: to jest żywa kolekcja HTMLCollection. Zmiany w DOM odzwierciedlają się w tej kolekcji od razu, gdy nastąpią. Jeśli element wybrany przez tę kolekcję przestaje spełniać warunek selektora, zostaje z niej automatycznie usunięty. Miejcie to na uwadze podczas iterowania.” (tłum. własne)
Część 3 · id kontra class

id kontra class: jeden element czy wiele?

id jest unikalny - w dokumencie może być tylko jeden element z danym id, jak numer PESEL, który ma tylko jedna osoba. Tę samą class może mieć naraz wiele elementów - jak nazwa klasy szkolnej, do której należy wielu uczniów.

id h1 id="title" jeden element unikalny w całym dokumencie class p class="item" p class="item" p class="item" wiele elementów może być ich dowolnie dużo
MDN, Web/API/Document/getElementById i Web/API/Document/getElementsByClassName
Część 4 · Odczytujemy wynik

Co dostajemy w zamian: tagName i length?

page.html:

<h1 id="title">Tytuł strony</h1>
<p class="item">Pierwszy element</p>
<p class="item">Drugi element</p>
<p class="item">Trzeci element</p>

script.js:

const heading = document.getElementById("title");
console.log(heading.tagName); // result wg MDN: "H1"

const items = document.getElementsByClassName("item");
console.log(items.length); // result wg MDN: 3

tagName zwraca nazwę znacznika elementu, wielkimi literami ("H1"). length to liczba elementów w kolekcji zwróconej przez getElementsByClassName - tu 3, bo w dokumencie są trzy elementy z klasą item.

Egzamin EE.09

Tak pytają na egzaminie

1.

W języku JavaScript metoda getElementById odwołuje się do

  1. zmiennej liczbowej.
  2. klasy zdefiniowanej w CSS.
  3. znacznika HTML o podanym id.
  4. znacznika HTML o podanej nazwie klasy.

2.

W skrypcie JavaScript zastosowano metodę DOM getElementsByClassName('paragraph'). Metoda ta odwoła się do akapitu

  1. <p>akapit</p>
  2. <p id="paragraph">akapit2</p>
  3. <p href="paragraph">akapit3</p>
  4. <p class="paragraph">akapit4</p>
CKE, EE.09, czerwiec 2019, zadanie 6 · CKE, EE.09, czerwiec 2019, zadanie 38
Ćwiczenie przy komputerze · 20 minut

Ćwiczenie: znajdujemy elementy w konsoli

  1. Otwórz page.html z poprzednich lekcji. Sprawdź, że masz element z id="title" i kilka elementów z class="item" - jeśli nie, dopisz je.
  2. W script.js pobierz element po id: const heading = document.getElementById("title"); i wypisz heading.tagName w konsoli.
  3. Pobierz kolekcję po klasie: const items = document.getElementsByClassName("item"); i wypisz items.length w konsoli.
  4. Sprawdź w przeglądarce (F12, konsola): otwórz page.html, zobacz wynik obu poleceń.
  5. Zapisz oba pliki i odśwież stronę w przeglądarce (Ctrl+R) - sprawdź, że oba wyniki wypisują się ponownie.
Na koniec

Sprawdź się

  1. Czym różni się getElementById od getElementsByClassName - ile elementów zwraca każda z tych metod?
  2. Co zwraca getElementById, jeśli nie znajdzie elementu o podanym id?
  3. Dlaczego kolekcja zwrócona przez getElementsByClassName nazywana jest „żywą”?

To tyle na dziś - kolejny temat: zmieniamy tekst i wygląd elementu.

Poza szkołą

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
getElementById / getElementsByClassNamedocument.querySelector() / querySelectorAll() - jedna metoda do wszystkiego (id, class, znacznik, dowolny selektor CSS)rozszerzane
Ręczne wyszukiwanie elementu przy każdej zmianieFrameworki (React, Vue) same śledzą, które elementy trzeba zmienićzastępowane
Żywa kolekcja HTMLCollectionquerySelectorAll zwraca NodeList - nie jest żywa, różnica bywa źródłem błędów przy pracy z kolekcjaminadal w użyciu
definicje metod - slajdy 3-4 (MDN)