
Rozklikávací menu
JavaScriptové menu otvírající/zavírající se po kliknutí.
Požadavky
- Rozbalení/sbalení při kliknutí na položku,
- sbalení při kliknutí někam mimo.
Postup řešení
Základ je jednoduché prohazování třídy. S tím, že rozbalovaná část je absolutně posicovaná.
Celé to komplikuje až vypínání menu při kliknutí mimo.
- Vytvoří se funkce pro schování libovolné položky z
#menu(odstraní případnou třídu, která submenu zviditelňuje),function closeAll() { var items = document.getElementById("menu").getElementsByTagName("li"); for (var i = items.length - 1; i >= 0; i--) { items[i].className = ""; }; } - ta se zavolá při kliknutí někam do stránky.
document.documentElement.onclick = closeAll;
„Probublávání“
Bohužel při kliknutí na položku, která rozkrývá podseznam, událost probublá i na documentElement, takže se submenu vzápětí ihned skryje.
Řešení je vypnutí této vlastnosti. Ve starších Explorerech funguje jen:
event.cancelBubble = true;
Ve všech novějších prohlížečích potom:
event.stopPropagation();
Aby to nebylo tak jednoduché, Firefox (Gecko) potřebuje na rozdíl od ostatních prohlížečů event předat do funkce.
<a onclick="funkce(event)" href="#">Rozbalit</a>
Kód sjednocující chování napříč prohlížeči proto značně nabobtná.
function nazevFunkce(e) {
e.cancelBubble = true; // vypnutí pro starší Explorery
if (e.stopPropagation) e.stopPropagation(); // vypnutí pro ostatní
// vlastní kód funkce
}
Výhoda potom je, že máme kód funkční ve všech prohlížečích (minimálně od IE 6).
Související články
Jak vkládat 3D objekty na web pomocí Three.js
Které formáty použít, jak vytvářet modely pomocí AI a kdy raději použít obrázek nebo video.
JavaScript null a undefined
Rozdíly mezi null a undefined v JavaScriptu, kdy je používat a jak se vyhnout běžným chybám.
Sleep v JavaScriptu
Jak implementovat sleep/delay funkcionalitu v JavaScriptu pomocí Promise a async/await