PáteÅà každého HTML dokumentu jsou znaÄky neboli tagy.
Podle DOMu (Document Object Model) je každá HTML znaÄka objekt. VnoÅené znaÄky jsou âdÄtmiâ vnÄjÅ¡Ãch. Text uvnitÅ znaÄky je také objekt.
VÅ¡echny tyto objekty jsou v JavaScriptu dostupné a my můžeme s jejich pomocà mÄnit stránku.
NapÅÃklad document.body je objekt, který pÅedstavuje znaÄku <body>.
Po spuÅ¡tÄnà tohoto kódu <body> na 3 sekundy zmÄnà barvu na Äervenou:
document.body.style.background = 'red'; // zmÄnà barvu pozadà na Äervenou
setTimeout(() => document.body.style.background = '', 3000); // vrátà ji zpÄt
Zde jsme použili style.background, abychom zmÄnili barvu pozadà document.body, ale existuje mnoho dalÅ¡Ãch vlastnostÃ, napÅÃklad:
innerHTMLâ HTML obsah uzlu,offsetWidthâ Å¡ÃÅka uzlu (v pixelech),- â¦a tak dále.
Brzy se nauÄÃme dalšà způsoby, jak manipulovat s DOMem, ale nejprve musÃme poznat jeho strukturu.
PÅÃklad DOMu
ZaÄnÄme s následujÃcÃm jednoduchým dokumentem:
<!DOCTYPE HTML>
<html>
<head>
<title>O losovi</title>
</head>
<body>
Pravda o losovi.
</body>
</html>
DOM reprezentuje HTML v podobÄ stromové struktury znaÄek. Vypadá následovnÄ:
Na uvedeném obrázku můžete klikat na elementové uzly a jejich dÄti se budou rozbalovat a schovávat.
Každý uzel stromu je objektem.
ZnaÄky jsou elementové uzly (nebo jen elementy) a tvoÅà strukturu stromu: jeho koÅenem je <html>, jeho dÄtmi jsou <head> a <body>, a tak dále.
Text uvnitÅ elementů tvoÅà textové uzly, oznaÄené jako #text. Textový uzel obsahuje pouze ÅetÄzec. Nesmà mÃt dÄti a je vždy listem stromu.
NapÅÃklad znaÄka <title> obsahuje text "O losovi".
ProsÃme, vÅ¡imnÄte si tÄchto zvláštnÃch znaků v textových uzlech:
- konec Åádku:
âµ(v JavaScriptu znám jako\n) - mezera:
â£
Mezery a konce Åádků jsou zcela platnými znaky, tak jako pÃsmena a ÄÃslice. TvoÅà textové uzly a stávajà se souÄástà DOMu. NapÅÃklad v uvedeném pÅÃkladu znaÄka <head> obsahuje pÅed <title> nÄkolik mezer, které se staly uzlem #text (který obsahuje pouze znak konce Åádku a nÄkolik mezer).
Existujà jen dvÄ výjimky na nejvyššà úrovni:
- Mezery a konce Åádků pÅed
<head>se z historických důvodů ignorujÃ. - Jestliže vložÃme nÄco za
</body>, bude to automaticky pÅemÃstÄno dovnitÅbodyna konec, jelikož specifikace HTML vyžaduje, aby vÅ¡echen obsah byl uvnitÅ<body>. Za</body>tedy nemohou být žádné mezery.
V ostatnÃch pÅÃpadech je vÅ¡echno jasné â jestliže jsou v dokumentu mezery (stejnÄ jako kterýkoli jiný znak), stanou se v DOMu textovými uzly, a pokud je odstranÃme, nebudou tam.
Zde nejsou žádné textové uzly, které by obsahovaly jen mezery:
<!DOCTYPE HTML>
<html><head><title>O losovi</title></head><body>Pravda o losovi.</body></html>
ProhlÞeÄové nástroje (brzy se o nich dozvÃme), které pracujà s DOMem, obvykle nezobrazujà mezery na zaÄátku a konci textu a prázdné textové uzly (konce Åádků) mezi znaÄkami.
VývojáÅské nástroje tÃmto způsobem Å¡etÅà mÃsto na obrazovce.
Na dalÅ¡Ãch obrázcÃch DOMu je také nÄkdy budeme vypouÅ¡tÄt, když nebudou mÃt význam. Tyto mezery zpravidla nemajà vliv na to, jak je dokument zobrazen.
Automatické opravy
Jestliže prohlÞeÄ narazà na poÅ¡kozený HTML kód, pÅi vytváÅenà DOMu jej automaticky opravÃ.
NapÅÃklad nejvyššà znaÄka bude vždy <html>. I kdyby v dokumentu nebyla, bude v DOMu vždy existovat, protože prohlÞeÄ ji vytvoÅÃ. Totéž platà pro <body>.
NapÅÃklad jestliže je HTML soubor tvoÅen jediným slovem "Ahoj", pak jej prohlÞeÄ zabalà do <html> a <body>, pÅidá požadovanou znaÄku <head> a DOM bude vypadat následovnÄ:
ProhlÞeÄe pÅi generovánà DOMu automaticky zpracujà chyby v dokumentu, uzavÅou znaÄky a podobnÄ.
Dokument s neuzavÅenými znaÄkami:
<p>Ahoj
<li>mami
<li>a
<li>tati
â¦se stane normálnÃm DOMem, jelikož prohlÞeÄ naÄte znaÄky a obnovà chybÄjÃcà Äásti:
<tbody>ZajÃmavým âzvláštnÃm pÅÃpademâ jsou tabulky. Podle specifikace DOMu musejà mÃt znaÄku <tbody>, ale HTML kód ji může vynechat. Pak prohlÞeÄ vytvoÅà <tbody> v DOMu automaticky.
Pro HTML:
<table id="tabulka"><tr><td>1</td></tr></table>
Struktura DOMu bude následujÃcÃ:
VidÃte? ZnaÄka <tbody> se zjevila odnikud. PÅi práci s tabulkami bychom to mÄli mÃt na pamÄti, abychom se vyhnuli pÅekvapenÃm.
Ostatnà typy uzlů
Existujà i jiné typy uzlů, než elementové a textové.
NapÅÃklad komentáÅe:
<!DOCTYPE HTML>
<html>
<body>
Pravda o losovi.
<ol>
<li>Los je elegantnÃ</li>
<!-- komentáŠ-->
<li>...a mazan̩ zv́e!</li>
</ol>
</body>
</html>
Tady vidÃme mezi dvÄma textovými uzly nový typ stromového uzlu â komentáÅový uzel, oznaÄený jako #comment.
Může nás napadnout â proÄ se vlastnÄ do DOMu pÅidává komentáÅ? Ten pÅece nemá na vzhled stránky žádný vliv. Existuje vÅ¡ak pravidlo â jestliže je nÄco v HTML, musà to být i v DOM stromu.
VÅ¡e v HTML, vÄetnÄ komentáÅů, se stává souÄástà DOMu.
Dokonce i direktiva <!DOCTYPE...> na samém zaÄátku HTML je DOM uzlem. V DOM stromu se nacházà tÄsnÄ pÅed <html>. O tom và jen málokdo. Nebudeme na tento uzel sahat, nebudeme jej ani kreslit v diagramech, ale je tam.
Objekt document, který pÅedstavuje celý dokument, je formálnÄ také DOM uzlem.
Celkem existuje 12 typů uzlů. V praxi obvykle pracujeme se ÄtyÅmi z nich:
documentâ âvstupnà bodâ DOMu.- elementové uzly â HTML znaÄky, stavebnà kameny stromu.
- textové uzly â obsahujà text.
- komentáÅe â nÄkdy do nich můžeme vkládat informace, které se nezobrazÃ, ale JS je může z DOMu naÄÃst.
PodÃvejte se sami
Chcete-li vidÄt strukturu DOMu v reálném Äase, zkuste Live DOM Viewer. StaÄà psát do dokumentu a ten se za okamžik zobrazà jako DOM.
DalÅ¡Ãm způsobem, jak prozkoumávat DOM, je použÃvat prohlÞeÄové vývojáÅské nástroje. PrávÄ ty použÃváme pÅi programovánÃ.
Abyste tak uÄinili, otevÅete si webovou stránku elk.html, zapnÄte si prohlÞeÄové vývojáÅské nástroje a pÅepnÄte se na záložku Elements (Prvky).
MÄla by vypadat pÅibližnÄ takto:
VidÃte DOM, klikáte na elementy, vidÃte jejich detaily a podobnÄ.
ProsÃme vÅ¡imnÄte si, že struktura DOMu ve vývojáÅských nástrojÃch je zjednoduÅ¡ená. Textové uzly jsou zobrazeny pouze jako text. A âprázdnéâ textové uzly (obsahujÃcà jen mezery) nejsou zobrazeny vůbec. To je dobÅe, neboÅ¥ ve vÄtÅ¡inÄ pÅÃpadů nás zajÃmajà pouze elementové uzly.
Po kliknutà na tlaÄÃtko v levém hornÃm rohu si můžeme zvolit uzel z webové stránky myšà (nebo jiným ukazovacÃm zaÅÃzenÃm) a âprozkoumatâ jej (záložka Elements se na nÄj posune). To funguje skvÄle, když máme obrovskou HTML stránku (a odpovÃdajÃcà obrovský DOM) a chceme se podÃvat na umÃstÄnà urÄitého jejÃho elementu.
Dalšà způsob, jak to udÄlat, je kliknout pravým tlaÄÃtkem na webovou stránku a v kontextovém menu zvolit âProzkoumatâ (âInspectâ).
V pravé Äásti nástrojů se nacházejà následujÃcà podzáložky:
- Styles (Styly) â můžeme vidÄt CSS aplikované na aktuálnà element, jedno pravidlo po druhém, vÄetnÄ vestavÄných pravidel (Å¡edÄ zobrazených). TémÄÅ vÅ¡echno můžeme na mÃstÄ editovat, vÄetnÄ rozmÄrů a vnÄjÅ¡Ãch i vnitÅnÃch okrajů boxu.
- Computed (VypoÄteno) â vidÃme CSS aplikované na element podle vlastnostÃ: pro každou vlastnost vidÃme pravidlo, které ji definuje (vÄetnÄ CSS dÄdiÄnosti a podobnÄ).
- Event Listeners (PosluchaÄe událostÃ) â vidÃme posluchaÄe událostà pÅipojené k DOM elementům (probereme je v pÅÃÅ¡tà Äásti tutoriálu).
- â¦a tak dále.
Nejlepšà způsob, jak je prostudovat, je klikat kolem dokola. VÄtÅ¡inu hodnot lze na mÃstÄ editovat.
Interakce s konzolÃ
PÅi práci s DOMem na nÄj můžeme také chtÃt aplikovat JavaScript. NapÅÃklad můžeme chtÃt naÄÃst uzel a spustit nÄjaký kód, který ho modifikuje, abychom vidÄli výsledek. Poskytneme nÄkolik rad, jak cestovat mezi záložkou Elements a konzolÃ.
Pro zaÄátek:
- Na záložce Elements zvolte prvnà znaÄku
<li>. - StisknÄte Esc â pÅÃmo pod záložkou Elements se otevÅe konzole.
Nynà je poslednà zvolený element k dispozici jako $0, pÅedposlednà zvolený jako $1, a tak dále.
Můžeme na nich spouÅ¡tÄt pÅÃkazy. NapÅÃklad $0.style.background = 'red' obarvà zvolený prvek seznamu ÄervenÄ, takto:
TÃmto způsobem tedy zÃskáme uzel ze záložky Elements v konzoli.
Existuje i opaÄná cesta. Jestliže se nÄjaká promÄnná odkazuje na DOM uzel, můžeme v konzoli použÃt pÅÃkaz inspect(uzel), abychom jej vidÄli v záložce Elements.
Nebo si prostÄ můžeme vypsat DOM uzel v konzoli a prozkoumat jej âna mÃstÄâ, napÅÃklad document.body následovnÄ:
To samozÅejmÄ sloužà pro úÄely ladÄnÃ. Od následujÃcà kapitoly budeme k DOMu pÅistupovat a modifikovat jej pomocà JavaScriptu.
ProhlÞeÄové vývojáÅské nástroje pÅedstavujà pÅi vývoji znaÄnou pomoc: můžeme prozkoumávat DOM, zkouÅ¡et různé vÄci a vidÃme, co se pokazilo.
ShrnutÃ
HTML/XML dokument je v prohlÞeÄi reprezentován DOM stromem.
- ZnaÄky se stávajà elementovými uzly a tvoÅà jeho strukturu.
- Text se stává textovými uzly.
- â¦atd., vÅ¡e, co je v HTML, vÄetnÄ komentáÅů, má v DOMu své mÃsto.
Pomocà vývojáÅských nástrojů můžeme DOM prozkoumávat a ruÄnÄ jej mÄnit.
V této kapitole jsme uvedli základy, nejpoužÃvanÄjšà a nejdůležitÄjšà akce, s kterými zaÄneme. Rozsáhlá dokumentace vývojáÅských nástrojů Chrome (Chrome Developer Tools) se nacházà na https://developers.google.com/web/tools/chrome-devtools. Nejlepšà způsob, jak se nauÄit nástroje použÃvat, je klikat sem a tam a ÄÃst menu: vÄtÅ¡ina možnostà je zÅejmá. Až je budete pozdÄji obecnÄ znát, pÅeÄtÄte si dokumentaci a nauÄte se zbytek.
DOM uzly obsahujà vlastnosti a metody, které nám umožÅujà mezi nimi cestovat, mÄnit je, pÅesunovat je na stránce a podobnÄ. Dostaneme se k nim v dalÅ¡Ãch kapitolách.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)