Element: attachShadow() Methode
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since January 2020.
* Some parts of this feature may have varying levels of support.
Die Element.attachShadow()
Methode fügt einem angegebenen Element einen Shadow-DOM-Baum hinzu und gibt eine Referenz auf dessen ShadowRoot
zurück.
Elemente, an die Sie einen Shadow anhängen können
Beachten Sie, dass Sie nicht an jeden Elementtyp einen Shadow-Root anhängen können.
Einige können aus Sicherheitsgründen keinen Shadow-DOM haben (zum Beispiel ).
Die folgende Liste enthält Elemente, an die Sie einen Shadow-Root anhängen können:
- Jedes autonome benutzerdefinierte Element mit einem gültigen Namen
Aufruf dieser Methode bei einem Element, das bereits ein Shadow-Host ist
Die Methode kann bei einem Element aufgerufen werden, das bereits eine deklarative Shadow-Root hat, vorausgesetzt, der angegebene Modus
mode
passt zum bestehenden Modus. In diesem Fall wird die bereits vorhandeneShadowRoot
geleert und zurückgegeben. Dies ermöglicht Situationen, in denen serverseitiges Rendering bereits deklarativ eine Shadow-Root erstellt hat und dann clientseitiger Code versucht, die Root erneut anzuhängen.Andernfalls wird das Aufrufen von
attachShadow()
bei einem Element, das bereits eine Shadow-Root hat, eine Ausnahme werfen.Syntax
jsattachShadow(options)
Parameter
options
-
Ein Objekt, das die folgenden Felder enthält:
mode
-
Ein String, der den Verkapselungsmodus für den Shadow-DOM-Baum angibt. Dies kann einer der folgenden sein:
open
-
Elemente der Shadow-Root sind von JavaScript außerhalb der Root zugänglich, zum Beispiel mit
Element.shadowRoot
:jselement.attachShadow({ mode: "open" }); element.shadowRoot; // Returns a ShadowRoot obj
closed
-
Verweigert den Zugriff auf die Knoten einer geschlossenen Shadow-Root von JavaScript außerhalb:
jselement.attachShadow({ mode: "closed" }); element.shadowRoot; // Returns null
clonable
Optional-
Ein Boolean, der angibt, ob die Shadow-Root kopierbar ist: Wenn auf
true
gesetzt, wird das Shadow-Host-Element, das mitNode.cloneNode()
oderDocument.importNode()
geklont wird, die Shadow-Root in die Kopie aufnehmen. Der Standardwert istfalse
. delegatesFocus
Optional-
Ein Boolean, der, wenn auf
true
gesetzt, ein Verhalten angibt, das Probleme mit der Fokussierbarkeit benutzerdefinierter Elemente mindert. Wenn auf einen nicht fokussierbaren Teil des Shadow-DOMs geklickt wird, erhält der erste fokussierbare Teil den Fokus, und das Shadow-Host-Element erhält jegliche verfügbare:focus
-Stilierung. Der Standardwert istfalse
. serializable
Optional-
Ein Boolean, der, wenn auf
true
gesetzt, angibt, dass die Shadow-Root serialisierbar ist. Wenn gesetzt, darf die Shadow-Root durch Aufrufen der MethodenElement.getHTML()
oderShadowRoot.getHTML()
mit dem Parameteroptions.serializableShadowRoots
auftrue
serialisiert werden. Der Standardwert istfalse
. slotAssignment
Optional-
Ein String, der den Slot-Zuweisungsmodus für den Shadow-DOM-Baum angibt. Dies kann einer der folgenden sein:
named
-
Elemente werden automatisch zu
-Elementen innerhalb dieser Shadow-Root zugewiesen. Alle Nachkommen des Hosts mit einemslot
-Attribut, das demname
-Attribut eines
innerhalb dieser Shadow-Root entspricht, werden diesem Slot zugewiesen. Jegliche obersten Nachkommen des Hosts ohneslot
-Attribut werden einem
ohnename
-Attribut (dem „Standard-Slot“) zugewiesen, wenn einer vorhanden ist. manual
-
Elemente werden nicht automatisch zu
-Elementen zugewiesen. Stattdessen müssen sie manuell mitHTMLSlotElement.assign()
zugewiesen werden. Der Standardwert istnamed
.
Rückgabewert
Gibt ein
ShadowRoot
Objekt zurück.Ausnahmen
NotSupportedError
DOMException
-
Dieser Fehler kann auftreten, wenn Sie versuchen, einem Element eine Shadow-Root hinzuzufügen:
- außerhalb des HTML-Namespace oder einem Element, das keinen Shadow haben kann.
- bei dem die statische Eigenschaft
disabledFeatures
des Elementdefinitionswerts den Wert"shadow"
hat. - das bereits eine Shadow-Root hat, die nicht deklarativ erstellt wurde.
- das eine deklarative Shadow-Root hat, aber der angegebene
mode
nicht mit dem vorhandenen Modus übereinstimmt.
Beispiele
Wortzähler benutzerdefiniertes Element
Das folgende Beispiel stammt aus unserem Wortzähl-Webkomponenten Demo (sehen Sie es auch live). Sie können sehen, dass wir
attachShadow()
in der Mitte des Codes verwenden, um eine Shadow-Root zu erstellen, an die wir dann die Inhalte unseres benutzerdefinierten Elements anhängen.js// Create a class for the element class WordCount extends HTMLParagraphElement { constructor() { // Always call super first in constructor super(); // count words in element's parent element const wcParent = this.parentNode; function countWords(node) { const text = node.innerText || node.textContent; return text .trim() .split(/\s+/g) .filter((a) => a.trim().length > 0).length; } const count = `Words: ${countWords(wcParent)}`; // Create a shadow root const shadow = this.attachShadow({ mode: "open" }); // Create text node and add word count to it const text = document.createElement("span"); text.textContent = count; // Append it to the shadow root shadow.appendChild(text); // Update count when element content changes this.parentNode.addEventListener("input", () => { text.textContent = `Words: ${countWords(wcParent)}`; }); } } // Define the new element customElements.define("word-count", WordCount, { extends: "p" });
Deaktivierung des Shadow-DOM
Wenn das Element eine statische Eigenschaft namens
disabledFeatures
hat, die ein Array mit dem String"shadow"
enthält, wird derattachShadow()
-Aufruf eine Ausnahme auslösen.Beispiel:
jsclass MyCustomElement extends HTMLElement { // Disable shadow DOM for this element. static disabledFeatures = ["shadow"]; constructor() { super(); } connectedCallback() { // Create a shadow root. // This will throw an exception. const shadow = this.attachShadow({ mode: "open" }); } } // Define the new element customElements.define("my-custom-element", MyCustomElement);
Spezifikationen
Specification DOM
# ref-for-dom-element-attachshadow①Browser-Kompatibilität
Siehe auch
ShadowRoot.mode
ShadowRoot.delegatesFocus
ShadowRoot.slotAssignment
- Deklaratives Anfügen einer Shadow-Root mit dem
shadowrootmode
-Attribut desElements
- Deklarativer Shadow-DOM auf web.dev (2023)