Shadow DOM — это технология, позволяющая создавать изолированные DOM-деревья внутри элементов. Cash предоставляет удобные методы для работы с Shadow DOM, облегчая манипуляцию и доступ к его содержимому, сохраняя при этом компактность кода и совместимость с другими функциями библиотеки.
Для создания Shadow DOM используется метод shadow():
const host = $('#host-element');
const shadowRoot = host.shadow({ mode: 'open' });
Параметры метода:
mode: может быть 'open' или
'closed'.
'open' — Shadow DOM доступен извне через свойство
shadowRoot.'closed' — доступ извне невозможен, элемент полностью
изолирован.Метод возвращает объект ShadowRoot, с которым можно
работать как с обычным DOM.
После создания Shadow Root можно добавлять в него элементы при помощи методов Cash:
const shadowRoot = $('#host-element').shadow({ mode: 'open' });
$(shadowRoot)
.append('Пример текста в Shadow DOM
')
.append('');
Методы append, prepend, html
работают так же, как с обычным DOM, но применяются к изолированному
дереву Shadow DOM.
Shadow DOM позволяет инкапсулировать стили, чтобы они не влияли на
остальную страницу и наоборот. Для добавления стилей используется
:
$(shadowRoot)
.append(`
`);
Все стили, добавленные внутрь Shadow DOM, применяются только к его элементам, что обеспечивает полную изоляцию.
Cash поддерживает селекторы для поиска элементов внутри Shadow DOM
через метод find:
const btn = $(shadowRoot).find('.btn');
btn.on('click', () => {
alert('Кнопка в Shadow DOM нажата!');
});
Методы find, children, closest
работают так же, как и в обычном DOM, но ограничены границами Shadow
Root, если поиск выполняется внутри него.
События в Shadow DOM могут всплывать наружу при
composed: true. Cash упрощает работу с событиями:
$(shadowRoot)
.find('.btn')
.on('click', (event) => {
console.log(event.target.textContent);
});
Особенности:
mode: 'closed')
события можно обрабатывать только внутри Shadow Root.Элементы и стили Shadow DOM можно изменять динамически, используя стандартные методы Cash:
const shadowRoot = $('#host-element').shadow({ mode: 'open' });
const paragraph = $(shadowRoot).find('p');
paragraph.text('Новый текст в Shadow DOM');
paragraph.css({
color: 'green',
fontSize: '18px'
});
Методы text, html, css
работают аналогично обычным DOM-элементам, что упрощает манипуляции и
позволяет строить динамические компоненты.
Shadow DOM обеспечивает полную изоляцию:
composed: true.Для взаимодействия с внешним DOM рекомендуется использовать методы Cash для событий или явное добавление ссылок на элементы.
Для удобства создания повторяющихся компонентов можно использовать
:
const template = document.createElement('template');
template.innerHTML = `
Заголовок
Содержимое карточки
`;
const shadowRoot = $('#host-element').shadow({ mode: 'open' });
$(shadowRoot).append(template.content.cloneNode(true));
Метод cloneNode(true) позволяет копировать весь контент
шаблона, сохраняя структуру и стили внутри Shadow DOM.
shadow(options) — создаёт Shadow Root и возвращает
его.find(selector) — поиск элементов внутри Shadow
DOM.append(content) / prepend(content) —
добавление элементов.html(content) / text(content) — изменение
содержимого.css(styles) — применение стилей.on(event, handler) — обработка событий внутри Shadow
DOM.Эти методы позволяют полностью управлять содержимым Shadow DOM, используя привычный интерфейс Cash, без необходимости работать с нативными API напрямую.