Narazil jsem o víkendu na https://leanrada.com/htmz/ a přijde mi to jako skvělý nástroj pro malé weby, kterým nestačí generátor statických stránek, ale JS framework je kanón na vrabce.
Přijde mi zvláštní, že autor zvolil funkci `replaceWith()`, protože vyžaduje, aby nový obsah byl včetně elementu, na který cílí. Já zkusil použil funkci `replaceChildren()` . Funguje stejně dobře a není potřeba řešit, že původní element zmizel.
#developer #javascript #htmz
htmz - a low power tool for html

@lawondyss "replaceWith" považuju za lepší, protože odrazuje programátora od vytváření referencí na ten obalový element.
@richard003 Nějak se nedokážu odprostit od vnímání obalového elementu jako místa, do kterého chci vložit nový obsah. Například při kliknutí na odkaz v menu načtu nový obsah do `<main>` tagu. Napadá tě příklad, kdy je to na škodu?
@lawondyss Ať už načítám obsah AJAXem nebo třeba vkládám instanci šablony, je přehlednější mít stejný obalový element na obou stranách, lépe se to čte.
@richard003 Stejná věc na dvou místech je něco, čemu se v programování snažím spíše vyhýbat. Pokud budu měnit layout, nestačí mi upravit jen šablonu s layoutem, ale musím zkontrolovat i ostatní šablony.
@lawondyss To ale není stejný kód na dvou místech, spíš to odpovídá stejnému názvu funkce při definici a při volání. Taky se to dá napsat bez duplikace, ale bude to nepřehledné. DRY je dobrý sluha ale zlý pán.
@richard003 Zřejmě jsem příliš zafixovaný v Latte & Nette, protože to pořád vnímám z pohledu šablonové struktury. Mám šablonu layout.latte s `<main>{block content}{/block}</main>` a do ostatních subšablon už `<main>` nepřidávám. Nette snippety také vždy nahrazují obsah svého elementu.
@lawondyss Jasně, latte a nette neznám, ale chápu že pokud jde jen o aktualizaci <main>, nemusí být výhody zřejmé. Tohle začne být zajímavé např. pokud načtete ze serveru stránku s několika bloky <div id="blok1">...</div><div id="blok2">...</div> atd., a chcete tím aktualizovat stejnojmenné bloky v zobrazené stránce.
@richard003 HTMZ neumí aktualizaci více bloků na stránce. Například jsem nepřišel na to, jak aktualizovat blok menu, aby mi rozsvítil aktivní odkaz, když jsem aktualizoval blok s obsahem.
@lawondyss A ten kód s aktivním odkazem vám přijde ze serveru, nebo ho "rozsvěcujete" úpravou na klientu? V každém případě, obyčejná JS funkce, která aktualizuje obsah a pak hned menu, by to měla řešit, ne?
@richard003 HTMZ funguje tak, že obsah odkazu, který vrací subšablonu, načte do skrytého iframe, a pak pomocí jednoduchého JS obsah z iframe přenese do stránky. Vždy nahrazuje pouze konkrétní element s daným ID, které je v odkazu za `#`. Takže například URL `/path/to/action#content` skončí na webu místo `<some_tag id="content">... </some_tag>`. Ze serveru mi tedy přijde jen zprocesovaná subšablona k dané akci.
@lawondyss Jasně, to je sice neefektivní (asi daň za jednoduchost JS), ale v principu by to nemělo vadit. Buď je stav menu na klientu, pak je to úplně jedno. Nebo je potřeba naučit server, aby na dané ID vracel jak příslušný obsah, tak i správně vyrenderované menu (ve dvou requestech), a smířit se s větším množstvím volání na server.
@richard003 Ano, pro bohatší funkcionalitu je potřeba další JS. HTMZ v podstatě nabízí koncept, jak mít něco mezi statickým webem a webem na JS frameworku.