--- title: Element.attachShadow() slug: Web/API/Element/attachShadow translation_of: Web/API/Element/attachShadow ---
{{APIRef('Shadow DOM')}} {{SeeCompatTable}}
Метод Element.attachShadow()
добавляет теневое DOM дерево к указанному элементу и возвращает ссылку на его ShadowRoot
( корневой элемент созданного дерева).
Обратите внимание, что не каждый элемент можно добавить в корень теневого дерева. Некоторые типы исключены по соображениям безопасности(например {{htmlelement("a")}}), и некоторые другие. Вот список разрешённых элементов:
var shadowroot = element.attachShadow(shadowRootInit);
shadowRootInit
ShadowRootInit
содержит следующие поля:
mode
: Строка указывающая на режим инкапсуляции для shadowDOM:
open.
Указывает на открытие режима инкапсуляции.element.shadowRoot === shadowroot; // returns true
closed.
Указывает на закрытие режима инкапсуляции.element.shadowRoot === shadowroot; // returns false element.shadowRoot === null; // returns true
Вернёт a {{domxref("ShadowRoot")}} или null.
Исключение | Описание |
InvalidStateError | Элемент уже является хостом теневого DOM |
NotSupportedError | Вы пытаетесь прикрепить shadow DOM к HTML элементу с некорректным именем, или к запрещённому элементу. (см. выше) |
Пример взят из демо компонента word-count-web-component, так-же доступно live demo. Вы можете найти метод attachShadow() примерно в середине кода. Метод создаёт корневой элемент теневого DOM к которому потом добавляется содержимое шаблона элемента.
//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
var wcParent = this.parentNode;
function countWords(node){
var text = node.innerText || node.textContent
return text.split(/\s+/g).length;
}
var count = 'Words: ' + countWords(wcParent);
// Create a shadow root
var shadow = this.attachShadow({mode: 'open'});
// Create text node and add word count to it
var text = document.createElement('span');
text.textContent = count;
// Append it to the shadow root
shadow.appendChild(text);
// Update count when element content changes
setInterval(function() {
var count = 'Words: ' + countWords(wcParent);
text.textContent = count;
}, 200)
}
}
// Define the new element
customElements.define('word-count', WordCount, { extends: 'p' });
Specification | Status | Comment |
---|---|---|
{{SpecName('DOM WHATWG', '#dom-element-attachshadow', 'attachShadow()')}} | {{Spec2('DOM WHATWG')}} |
{{Compat("api.Element.attachShadow")}}