Lekce 17 - Manipulace s DOM v JavaScriptu
V minulé lekci, Zpracování událostí DOM pomocí posluchačů v JavaScriptu, jsme se naučili pracovat s událostmi pomocí posluchačů a lépe strukturovat naše aplikace s využitím externích souborů.
Dnešní JavaScript tutoriál bude zaměřen na manipulaci DOM elementů. Ukážeme si na připravené webové stránce další možnosti výběru elementů z HTML stránky a naučíme se měnit jejich obsah.
Výběr elementů
Než se do manipulace s elementy pustíme, musíme je umět
vyhledat. Již umíme použít metodu
getElementById()
, která je sice velmi účelná a rychlá, ale
není vždy ideální. Někdy je například potřeba vybrat více
elementů a někdy je třeba vybrat elementy bez id
. Není
totiž podmínkou, že budeme vybírat z dokumentu, ke kterému máme přístup
a přítomnost id
si zajistíme sami.
Metody pro výběr elementů
Pojďme si tedy nejprve krátce představit další metody objektu
document
umožňující vyhledat elementy DOM:
getElementsByClassName(className)
– Tato metoda vrátí všechny elementy s odpovídajícím názvem třídy (HTML atributemclass
) uvedeném v jejím parametru.getElementsByTagName(tagName)
– Pomocí této metody vyhledáme všechny elementy s uvedeným HTML tagem.getElementsByName(name)
– Tato další metoda se používá především pro vyhledávání prvků ve formulářích, vrací elementy podle atributuname
.
Elementy můžeme vybírat také podle CSS selektorů, jak jsme zvyklí z webdesignu. Využijeme k tomu metody:
querySelector(cssSelector)
– Vrátí první nalezený element.querySelectorAll(cssSelector)
– Vrátí všechny elementy odpovídající zadanému selektoru.
HTML dokument pro práci s DOM
Abychom mohli vyzkoušet všechny metody v této lekci, budeme využívat
jednoduché stránky pekařství, které máme k dispozici v archivu dole pod
lekcí v souboru s názvem soubor_pro_praci
. Jsou zde níže
popsané soubory HTML a CSS, složka img/
se dvěma obrázky a
složka js/
s prázdným souborem dom.js
, do kterého
budeme postupně přidávat jednotlivé metody.
Ukažme si náš HTML dokument obsahující stránku pekařství:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Domácí pekařství</title> <script src="js/dom.js"></script> <link rel="stylesheet" href="style.css" type="text/css"/> </head> <body> <header> <img id="logo" src="img/baker.svg" alt="Logo pekařství"> <h1 id="greeting">Vítejte v našem pekařství</h1> </header> <p>V naší prodejně<span class="important"> aktuálně nabízíme:</span></p> <ul> <li>Čerstvý chléb</li> <li>Pečivo</li> <li>Koláče</li> <li>Moučníky</li> <li>Dorty</li> </ul> <p class="important">Čerstvé křupavé pečivo a lahodné dezerty z naší pekárny denně na váš stůl!<span style="display: none;"> Aktuálně nabízíme i objednávky na vánoční cukroví.</span></p> <img src="img/pastry.jpg" alt=""> </body> </html>
Jedná se o jednoduchou stránku pekařství. Na začátku je logo s
uvítacím nadpisem <h1>
, následované textem
<p>
. Ten uvádí aktuální nabídku, která je formátována
jako neuspořádaný seznam za pomoci elementu <ul>
. Dále je
zde druhý element <p>
s textem, který má navíc skrytou
část textu pomocí atributu style
s hodnotou
display: none;
. Na konci je pak obrázek.
V samostatném souboru style.css
máme jednoduchý CSS styl,
který je nalinkován do hlavičky HTML souboru:
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;800&display=swap'); body { font: 14px "Poppins"; } body > header { height: 80px; width: 100%; background: #be9853; color: white; display: flex; justify-content: center } .important { font-weight: bold; color: #71592c; } #logo { height:100%; } img { height: 350px; }
Stránka vypadá v prohlížeči takto:
Výběr elementů a výpis do konzole
V hlavičce dokumentu máme odkaz na soubor js/dom.js
. Do něj
budeme postupně zapisovat metody pro manipulaci s DOM. Nejprve vyhledáme
elementy se zvýrazněným textem:
document.addEventListener("DOMContentLoaded", function() { let elements = document.getElementsByClassName("important"); // Sem budeme postupně doplňovat další js kód });
Metoda getElementsByClassName()
vrací seznam nalezených
elementů HTMLCollection
, což je kolekce podobná poli, ale
poskytuje méně metod a vlastností než klasické pole. Pokud hledaná třída
nemá žádný element, získáme prázdný seznam a vlastnost
length
bude mít hodnotu 0
.
V našem případě se do HTMLCollection
vloží dva elementy:
<p>
a <span>
. Kolekci pomocí cyklu nyní
vypíšeme do konzole, uděláme to tak, že kód uvedený
výše v souboru dom.js
doplníme:
for (let i = 0; i < elements.length; i++) { console.log(elements[i]); }
Tento kód a veškeré další ukázky budou uvnitř anonymní funkce, ve které čekáme na načtení dokumentu.
Dále si po spuštění webové stránky pekařství v prohlížeči otevřeme vývojářskou konzoli pomocí klávesy F12 a klikneme na záložku Konzole. V Google Chrome vypadá konzole takto:
Vidíme zde, že se podařilo vyhledat a vypsat oba elementy, druhý včetně skrytého textu.
Nyní vybereme a vypíšeme všechny odstavce v dokumentu, použijeme tedy
metodu getElementsByTagName()
:
let paragraphs = document.getElementsByTagName("p"); for (let i = 0; i < paragraphs.length; i++) { console.log(paragraphs[i]); }
Opět se podíváme na výstup z konzole:
Výběr podle CSS selektoru
Ukažme si nyní, jak vybrat jeden element pomocí metody
querySelector()
a více elementů metodou
querySelectorAll()
. Jako selektor můžeme zadat #id
,
.class
pro třídu, atribut v hranatých závorkách nebo tag
elementu.
V následující ukázce použijeme v kódu mřížku
#
. Ta se na české klávesnici píše pomocí
Pravého Alt a klávesy X:
V následujícím příkladu vyhledáme element s id
greeting
, zvýrazněný text, obrázek a elementy
<span>
:
let title = document.querySelector("#greeting"); let text = document.querySelector(".important"); let picture = document.querySelector('[src="img/pastry.jpg"]'); let spans = document.querySelectorAll("span"); console.log(title); console.log(text); console.log(picture); for (let i = 0; i < spans.length; i++) { console.log(spans[i]); }
V JavaScriptu můžeme pro zadávání řetězců používat
jednoduché ('
), dvojité ("
), nebo zpětné
(`
) uvozovky. Jednoduché a dvojité uvozovky jsou zaměnitelné a
můžeme je používat pro obalení selektorů nebo hodnot atributů, je ale
nezbytné držet se stejné konvence v celém kódu. Na výpis textových
řetězců můžeme použít takzvaný tupý přízvuk (`
) namísto
uvozovek, což nám umožní interpolaci, tedy vložení proměnné přímo do
řetězce. Problematice uvozovek se věnujeme v kapitole Textové řetězce v
JavaScriptu.
V konzoli se nám zobrazí:
Jednotlivé selektory lze mezi sebou řetězit. Kdybychom chtěli vybrat
pouze elementy <p>
, které mají třídu
important
, upravili bychom metodu querySelectorAll()
takto:
document.querySelectorAll("p.important");
Když jsme již schopni vybrat úplně každý element v DOM, můžeme se pustit do jejich editace.
Editace obsahu DOM
Nyní se zaměříme na to, jak manipulovat s obsahem elementů v Document Object Model (DOM). Budeme se věnovat jejich vlastnostem, které nám umožňují číst i měnit obsah elementů na našich webových stránkách. Tato dovednost je klíčová pro dynamické změny webových stránek v reálném čase.
Vlastnosti innerText
a
textContent
Vlastnost innerText
umožňuje získat nebo nastavit textový
obsah elementu, přičemž nebere v potaz všechny HTML značky uvnitř
elementu. Bere ale v úvahu stylování a text vrací tak, jak je vykreslen na
stránce. Tedy ignoruje skryté elementy a zachovává
vizuální formátování (například odřádkování). Změňme text na naší
stránce:
let paragraph = document.querySelector("p"); paragraph.innerText = "Dnes máme v nabídce:";
Na stránce se nám zobrazí upravený úvodní odstavec:
Vlastnost textContent
funguje podobně jako
innerText
. Hlavní odlišností je, že innerText
respektuje stylizaci CSS a vrací text tak, jak je vykreslený na stránce. To
znamená, že skrytý text (například pomocí atributu
display: none;
) nebude zahrnut v návratové hodnotě
innerText
. Na druhou stranu, textContent
ignoruje
stylování a vrací veškerý text obsažený v elementu,
včetně toho, který je skrytý. Tato vlastnost je rychlejší, protože
nepotřebuje zjišťovat, jaký text je viditelný na základě aplikovaných
stylů.
V naší ukázce máme skrytý text před obrázkem, jde o druhý výskyt
elementu <p>
. Pojďme si jej nechat pomocí obou vlastností
vypsat:
let hiddenText = document.querySelectorAll("p"); console.log(hiddenText[1].innerText); console.log(hiddenText[1].textContent);
V konzoli vidíme:
Vlastnost innerHTML
Podobně jako innerText
funguje i vlastnost
innerHTML
, která reprezentuje HTML obsah
elementu. V našem HTML dokumentu máme nabízené produkty jako položky
seznamu (<li>
), vybereme pátou položku a necháme ji vypsat
do konzole:
let products = document.querySelectorAll("li"); let fifthItem = products[4]; console.log(fifthItem.innerText);
Pro práci s tímto elementem v JavaScriptu na něj nejprve potřebujeme
získat odkaz. Poté načteme jeho vlastnost innerHTML
a vypíšeme
ji do konzole:
Obsah elementu můžeme úplně stejně i měnit, upravme předchozí příklad a škrtněme z nabídky položku dorty:
let products = document.querySelectorAll("li"); products[4].innerHTML = "<s>Dorty</s>";
Vnitřní HTML tagy vlastnosti innerHTML
se zpracují. Na
stránce se nám v prvním odstavci změní text na:
Nyní již víme, jak číst a měnit obsah elementů. Podíváme se tedy na editaci jejich atributů.
Editace atributů DOM
Při práci s DOM je klíčové umět pracovat s atributy a potomky jednotlivých elementů.
Metoda hasAttribute()
Základní otázkou je, zda element hledaný atribut vůbec má. To zjistíme
metodou hasAttribute()
, která jako parametr bere název atributu a
vrací true
nebo false
.
Takto například zjistíme, zda u loga máme vyplněný
<alt>
:
let logoImage = document.querySelector("#logo"); console.log(logoImage.hasAttribute("alt")); // Vrátí true
Existuje i metoda hasAttributes()
v množném
čísle, která vrací, jestli má element vůbec nějaký atribut. Pokud nemá
žádný, vrátí false
, pokud má alespoň jeden, vrátí
true
. Tato metoda nebere žádný parametr.
Metoda setAttribute()
Pro obrázek chleba jsme atribut alt
neuvedli. Pojďme to
opravit. Do kódu výše přidáme metodu setAttribute()
, které v
parametru zadáme jeho název a hodnotu. Obecná syntaxe je:
element.setAttribute(attributeName, value);
Pokud chceme nastavit atribut alt
, postupujeme následovně:
let image = document.querySelector('[src="img/pastry.jpg"]'); image.setAttribute("alt", "Chléb"); console.log(image.hasAttribute("alt")); // Nyní vrátí true
Podívejme se na výstup konzole:
Na závěr ještě budeme chtít zvýraznit nabídku čerstvého chleba:
let firstListItem = document.querySelector("li"); firstListItem.setAttribute("class", "important");
Ten si tedy pomocí selektoru získáme a nastavíme mu třídu
important
. Nyní se podíváme na výsledek v prohlížeči:
Celý kód projektu je opět k dispozici v archivu lekce. Zkuste si jej upravit a vyhledat nebo změnit další elementy DOM.
V příští lekci, Tvorba elementů a hierarchie DOM v JavaScriptu, si popíšeme hierarchii elementů a naučíme se vytvořit nový element a přidat jej do HTML stránky.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 320x (328.15 kB)
Aplikace je včetně zdrojových kódů v jazyce JavaScript