TAG
JavaScript
Result
Run
License
<h2>Click to menu</h2> <template id="menu-template"> <slot name="list"></slot> <dl> <dt><slot name="name"></slot></dt> <dd><slot name="summary"></slot></dd> </dl> </template> <menu-detail> <ul slot="list"> <li data-menu-code="americano">아메리카노</li> <li data-menu-code="cappuccino">카프치노</li> </ul> <h2 data-menu-code="americano">아메리카노</h2> <h2 data-menu-code="cappuccino">카프치노</h2> <p data-menu-code="americano">아메리카노는 에스프레소를 뜨거운 물로 희석하여 마시는 커피 음료의 한 종류이다.</p> <p data-menu-code="cappuccino">카푸치노는 에스프레소, 뜨거운 우유, 그리고 우유 거품을 재료로 만드는 이탈리아의 커피 음료다.</p> </menu-detail>
document.addEventListener("DOMContentLoaded", () => { window.customElements.define( "menu-detail", class extends HTMLElement { constructor() { super(); const elTemplate = document.getElementById("menu-template").content; const shadowRoot = this.attachShadow({ mode: "open" }); shadowRoot.append(elTemplate.cloneNode(true)); const $nlElMenu = this.querySelectorAll("ul > li"); const $nlElName = this.querySelectorAll("h2"); const $nlElSummary = this.querySelectorAll("p"); $nlElMenu.forEach(elItem => elItem.addEventListener("click", showDetail)); function showDetail(e) { const $elTarget = e.currentTarget; let menuCode = $elTarget.dataset.menuCode; $nlElMenu.forEach(elItem => elItem.style.backgroundColor = "white"); $elTarget.style.backgroundColor = "yellow"; $nlElName.forEach(el => { el.removeAttribute("slot"); if(menuCode == el.dataset.menuCode) { el.setAttribute("slot", "name"); } }); $nlElSummary.forEach(elP => { elP.removeAttribute("slot"); if(menuCode == elP.dataset.menuCode) { elP.setAttribute("slot", "summary"); } }); } const $elSlotSummary = this.shadowRoot.querySelector("dd > slot"); $elSlotSummary.addEventListener("slotchange", e => { const aElements = e.currentTarget.assignedElements(); console.log(e.currentTarget.name, aElements[0].textContent); }); } } ); });
Console
expand_less
License
License
by DevDic
Close