🌳 DOM: práce se stránkou z JavaScriptu

Rodokmen stránky

O čem to je

Klikneš na „Přidat do košíku“ a číslo u košíku se zvýší, aniž by se stránka načetla znovu. JavaScript tu změnil kousek stránky. Aby to šlo, musí stránku „vidět“ v podobě, se kterou umí pracovat. Ta podoba se jmenuje DOM.

Nové pojmy

JavaScriptProgramovací jazyk, který běží v prohlížeči a dává stránce chování.Po kliknutí přepne tmavý režim.
DOMDocument Object Model. Prohlížeč z HTML postaví strom objektů v paměti. JavaScript ve stromu hledá, mění, přidává a maže a prohlížeč změnu hned ukáže.Změníš text objektu nadpisu a nadpis na obrazovce se přepíše.
Uzel a elementUzel je každý kousek stromu: element, text i komentář. Element je uzel, který vznikl ze značky (<p>, <li>…).<p>Ahoj</p> = element p a v něm textový uzel „Ahoj“.

Strom jako rodokmen

DOM vypadá jako rodokmen. Úplně nahoře je document, pod ním html a pod ním dvě větve head a body. Každá další značka je další větev nebo lístek stromu.

Rodič, potomek, sourozenecRodič je element, ve kterém jiný element přímo leží. Potomek (dítě) je element uvnitř. Sourozenci mají stejného rodiče.V <ul><li>A</li><li>B</li></ul> je ul rodič a obě li jsou sourozenci.

Najdi, změň, přidej

querySelectorMetoda, která najde první element podle CSS selektoru. querySelectorAll najde všechny a vrátí jejich seznam.document.querySelector('#kosik'), document.querySelectorAll('.produkt')
Na stránce je <span id="pocet">0</span>. Napiš kód, který po kliknutí na <button id="pridat"> zvýší číslo o 1.
const pocet = document.querySelector('#pocet'); const btn = document.querySelector('#pridat'); btn.addEventListener('click', () => { pocet.textContent = Number(pocet.textContent) + 1; });. textContent je text elementu; protože je to string, převedeme ho na číslo.
Přidej do seznamu <ul id="ukoly"> nový úkol „Nakoupit“.
const li = document.createElement('li'); vytvoří nový element (zatím mimo stránku). li.textContent = 'Nakoupit'; mu dá text. document.querySelector('#ukoly').append(li); ho připojí jako posledního potomka. Teprve teď se objeví na stránce.

Doplň správnou metodu nebo vlastnost.

✗Text od uživatele vložím do stránky přes el.innerHTML = komentar;.
✓Text od uživatele vkládej přes el.textContent = komentar;.

innerHTML text vyloží jako HTML. Útočník může napsat komentář s kódem a ten se spustí ostatním návštěvníkům. Tomu útoku se říká XSS. textContent vloží vždy jen obyčejný text.

DOM je strom objektů, který prohlížeč postaví z HTML. JavaScript v něm hledá (querySelector), mění (textContent, classList), vytváří a připojuje (createElement, append) a prohlížeč změny hned vykreslí. Text od uživatele patří do textContent, ne do innerHTML.

Recepty

O čem to je

Práce s DOM se skládá ze stále stejných úkonů: najít element, změnit ho, reagovat na událost. Tady je máš jako krátké recepty, které budeš skládat dohromady.

Nové pojmy

DOMStrom objektů, který prohlížeč vytvoří z HTML. Každý element je objekt s vlastnostmi a metodami. Změna objektu se hned projeví na stránce.document.title = 'Nový název' změní text v záložce.
SelektorVýraz z CSS, který vybírá elementy: #id, .trida, p, nav a.'#formular input'
Událost a posluchačUdálost je něco, co se stane (kliknutí, psaní, odeslání). Posluchač je funkce navázaná přes addEventListener. Dostane objekt události s podrobnostmi.form.addEventListener('submit', (e) => { … })

Tahák

ChciKód
najít jeden elementdocument.querySelector('.x') nebo document.getElementById('x')
najít všechnydocument.querySelectorAll('.x') (vrátí seznam, projdeš for…of)
změnit textel.textContent = 'text'
vložit HTML (jen důvěryhodné!)el.innerHTML = '<b>tučně</b>'
přidat / odebrat / přepnout tříduel.classList.add('x'), .remove('x'), .toggle('x')
změnit stylel.style.color = 'red'
vytvořit a připojitconst p = document.createElement('p'); rodic.append(p);
odstranitel.remove()
hodnota pole formulářeinput.value

Recept: kontrola formuláře

Najdi formulář a pole: const form = document.querySelector('form'); const mail = document.querySelector('#mail');
Navaž posluchač na submit: form.addEventListener('submit', (e) => { … });
Uvnitř zkontroluj hodnotu: if (!mail.value.includes('@')) { … }
Při chybě zastav odeslání: e.preventDefault(); a zobraz hlášku přes textContent.
Server přesto data zkontroluje znovu – kontrola v prohlížeči jde obejít.
preventDefaultMetoda objektu události. Zruší výchozí chování prohlížeče: formulář se neodešle, odkaz se neotevře.e.preventDefault();
Tlačítko #tema má přepínat tmavý režim. CSS má hotovou třídu .tmavy pro body. Napiš JS.
document.querySelector('#tema').addEventListener('click', () => { document.body.classList.toggle('tmavy'); });. toggle třídu přidá, když chybí, a odebere, když tam je. Vzhled zůstává v CSS, JS jen přepíná třídu.
Všechny odkazy v nav mají dostat třídu odkaz. Jak?
for (const a of document.querySelectorAll('nav a')) { a.classList.add('odkaz'); }. querySelectorAll vrátí seznam a cyklus for…of ho projde. Volat classList přímo na seznamu nejde, je to metoda jednoho elementu.

Roztřiď nástroje podle toho, k čemu slouží.

✗Skript v <head> bez defer zavolá document.querySelector('#menu') a dostane null.
✓Skript dej na konec <body> nebo mu přidej atribut defer.

Prohlížeč čte HTML shora. Skript v hlavičce běží dřív, než se #menu vůbec dostane do DOM.

Recept na DOM: najdi (querySelector, querySelectorAll), změň (textContent, classList, style, append, remove), reaguj (addEventListener, preventDefault). Skript spouštěj až po načtení HTML a vzhled nech v CSS.