Ce face Element.attachShadow / setHTMLUnsafe
attachShadow atașează elementului o rădăcină umbră (shadow root). Ce pui în ea este afișat în locul conținutului obișnuit, iar stilurile din interior nu ies în pagină și nici cele din pagină nu intră. Cu mode: "open", rădăcina este accesibilă prin element.shadowRoot.
setHTMLUnsafe(html) funcționează ca innerHTML, dar înțelege și Shadow DOM declarativ (<template shadowrootmode="open">). Ca și innerHTML, nu curăță HTML-ul periculos: nu-i da texte de la utilizatori.
Parametri
| Parametru | Descriere |
|---|---|
optiuni |
Pentru attachShadow: { mode: "open" } sau "closed". |
Ce returnează
attachShadow: un ShadowRoot. setHTMLUnsafe: undefined.
Exemple
Exemplul 1: O componentă cu stil izolat
document.querySelector nu vede elementele din Shadow DOM.
class EtichetaPret extends HTMLElement {
connectedCallback() {
const umbra = this.attachShadow({ mode: "open" });
umbra.innerHTML = `
<style>span { color: white; background: crimson; padding: 2px 6px; }</style>
<span>${this.getAttribute("valoare")} lei</span>`;
}
}
customElements.define("eticheta-pret", EtichetaPret);
document.body.insertAdjacentHTML("beforeend", '<eticheta-pret valoare="99"></eticheta-pret>');
const el = document.querySelector("eticheta-pret");
console.log(el.shadowRoot.querySelector("span").textContent, document.querySelector("span"));
Rezultat în browser
99 lei null
Exemplul 2: Shadow DOM declarativ cu setHTMLUnsafe
const gazda = document.createElement("div");
gazda.setHTMLUnsafe('<template shadowrootmode="open"><b>din umbră</b></template>');
console.log(gazda.shadowRoot.innerHTML);
Rezultat în browser
<b>din umbră</b>
Greșeli frecvente
- Apelezi
attachShadowde două ori pe același element (de exemplu într-unconnectedCallbackrulat iar) și primeștiNotSupportedError. Verifică întâithis.shadowRoot.
Comenzi înrudite
document.createElement: Creează un element HTML nou (încă invizibil), pe care îl completezi și apoi îl adaugi în pagină.insertAdjacentHTML / insertAdjacentElement: Inserează HTML, un element sau text într-una din patru poziții față de element, fără să refacă restul conținutului.textContent / innerHTML: Citește sau schimbă conținutul unui element: ca text simplu sau ca HTML.