Úloha 5 – Interaktivní kategorie produktů s přepínáním obsahu
| Stránky: | Moodle ZČU |
| Kurz: | Sada úloh pro procvičení v předmětu KVD/PGM1P (BP Vítek Dolný) |
| Kniha: | Úloha 5 – Interaktivní kategorie produktů s přepínáním obsahu |
| Vytiskl(a): | Nepřihlášený host |
| Datum: | neděle, 18. října 2026, 04.25 |
Úvod do úlohy
Závěrečná část práce s DOM směřuje k tomu, aby studenti nejen rozuměli jednotlivým technikám manipulace s prvky, ale dokázali psát přehledný, efektivní a bezpečný kód. V praxi se často setkáme s projekty, kde je JavaScript neorganizovaný, obsahuje zbytečné opakování, přímé zásahy do stylů a nadbytečné operace nad DOMem. Takový kód bývá pomalý, obtížně udržovatelný a náchylný k chybám.
Cílem této kapitoly je naučit se optimalizovat práci s DOM, minimalizovat přepočty rozložení stránky (reflow) a zachovat jasnou strukturu kódu podle principů oddělení obsahu, stylu a logiky.
Teorie a principy
Minimalizace zásahů do DOM
Každý přístup nebo změna v DOM může způsobit tzv. reflow – přepočet pozic a rozměrů prvků. Pokud provádíme mnoho takových změn po sobě (například v cyklu), může dojít ke zpomalení celé stránky.
Základní zásady:
-
Měňte více prvků najednou pomocí
DocumentFragment. -
Vkládejte do DOM až hotové bloky místo jednotlivých uzlů.
-
Snažte se nepřistupovat zbytečně ke stejnému elementu opakovaně – uložte si ho do proměnné.
-
Místo přímého měnění stylů (
element.style.color = "red") používejte CSS třídy aclassList.
DRY princip (Don’t Repeat Yourself)
Duplicitní kód bývá hlavním zdrojem chyb.
Pokud se stejná akce provádí na více místech, zabalte ji do funkce a znovu použijte.
Příklad: místo tří identických posluchačů kliknutí můžeme vytvořit jedinou univerzální funkci, kterou voláme s parametrem.
Oddělení logiky, obsahu a stylu
Moderní webové aplikace dodržují zásadu:
-
HTML = struktura a obsah
-
CSS = vzhled
-
JavaScript = chování
Znamená to, že JavaScript by neměl obsahovat přímé definice stylů, ale měl by spíše měnit třídy nebo atributy. To udržuje kód přehledný a usnadňuje spolupráci mezi vývojáři.
Bezpečnost a čitelnost
-
Vyhýbejte se vkládání neověřeného obsahu pomocí
innerHTML. -
Používejte jasné názvy proměnných (např.
btnOdeslatmístob1). -
Přidávejte komentáře u méně zřejmých částí.
-
Kontrolujte, zda prvky existují, než s nimi pracujete.
Praktické příklady kódu
Příklad 1: Neefektivní verze
Příklad 2: Optimalizovaná verze s DocumentFragment
Příklad 3: Oddělení stylu od logiky
Tento přístup je přehlednější a umožňuje později měnit vzhled pouze v CSS bez zásahu do JavaScriptu.
Příklad 4: Použití pomocné funkce (DRY princip)
Typické chyby / záludnosti
-
Zbytečné přístupy k DOM
– Při každém volánídocument.getElementById()prohlížeč znovu prochází strukturu. Uložte si prvek do proměnné. -
Nadměrné úpravy stylů v kódu
– Udržujte stylování v CSS. V JavaScriptu měňte jen třídy. -
Vkládání HTML bez kontroly
–innerHTMLje výkonný, ale může být nebezpečný. PoužívejtetextContent, pokud nepotřebujete značky. -
Nepřehledná logika bez funkcí
– Kód rozdělte do menších funkčních celků. Každá funkce by měla mít jasný účel. -
Ignorování výkonu při generování většího obsahu
– Vždy zvažte využitíDocumentFragmentnebo dočasných proměnných.
Shrnutí
-
Optimalizujte manipulaci s DOM – méně změn, ale promyšleně.
-
Používejte
DocumentFragmentpro hromadné vkládání prvků. -
Dodržujte zásady oddělení obsahu, stylu a logiky.
-
Dbejte na čitelnost, opakovanou použitelnost a bezpečnost kódu.
-
Vyhněte se duplicitám a používejte funkce podle DRY principu.
-
Každá změna v DOM by měla být záměrná, promyšlená a efektivní.
Úloha
Zadání (kontext úlohy):
Na stránce jsou tři tlačítka – „Ovoce“, „Zelenina“ a „Nápoje“. Po kliknutí na jedno z nich se v seznamu zobrazí odpovídající skupina produktů. Po opětovném kliknutí na stejné tlačítko se seznam vymaže. Vše musí fungovat efektivně – bez zbytečných přístupů k DOM a bez přímého měnění stylů.
Cíl úlohy:
Procvičit efektivní manipulaci s DOM pomocí DocumentFragment, oddělení stylu od logiky (pomocí CSS tříd) a práci s funkcemi podle DRY principu.
Vstupní podmínky:
Student pracuje pouze s jedním HTML souborem.
Data jsou uložena přímo v JavaScriptu v podobě tří polí (ovoce, zelenina, nápoje).
Každé kliknutí přepíše obsah seznamu novou sadou položek, nebo ho vyprázdní, pokud se klikne znovu na stejnou kategorii.
Požadovaný výstup:
-
Na stránce bude:
-
nadpis „Seznam produktů“,
-
tři tlačítka: „Ovoce“, „Zelenina“, „Nápoje“,
-
prázdný
<ul id="seznam">.
-
-
Po kliknutí na tlačítko se seznam naplní položkami příslušné kategorie.
-
Kliknutí na stejné tlačítko podruhé seznam vyprázdní.
-
Vložené položky musí být vytvořeny pomocí
DocumentFragment. -
Aktivní tlačítko se vizuálně zvýrazní pomocí CSS třídy
.aktivni.
Doplňující pokyny:
-
Použij
classList.add()aremove()k přepínání zvýraznění tlačítek. -
Zabraň opakovanému vykreslování stejné kategorie.
-
Vyhni se přímému nastavování stylů pomocí
style, využij třídu.aktivni. -
Logiku rozděl do tří funkcí:
vytvorSeznam(pole),vymazSeznam(),zmenKategorii().
Řešení úlohy
Co je zde splněno
-
Oddělení logiky a stylu: zvýraznění přes .aktivni (žádné
stylev JS). -
Efektivní render: položky se vkládají jedním krokem přes DocumentFragment.
-
Tři požadované funkce: vytvorSeznam(pole), vymazSeznam(), zmenKategorii().
-
Přepínání aktivního tlačítka přes classList.add()/remove().
-
Zabránění zbytečnému překreslení: klik na stejné aktivní tlačítko seznam vyprázdní.
-
Vše v jednom HTML souboru, bez nadbytečných přístupů k DOM.
Vylepšení oproti začátečnické verzi
-
Delegace událostí na obalujícím prvku tlačítek → méně listenerů, snadné rozšíření.
-
Map+datasetpro čisté párování tlačítek a dat. -
Stručné šipkové funkce,
for...of,closest()– čitelný, moderní kód. -
Vyprázdnění seznamu přes
textContent = ""(rychlé), ale stále vytváření položek přes DocumentFragment.