Поскольку тень инкапсулирует детали компонента, она предотвращает регулярный обход DOM. Чтобы получить к нему доступ:
- Найдите веб-компонент, доступный в свете DOM
- Пройдите по его тени DOM:
const lightComponent = document.querySelector('web-component')
const shadowInput = lightComponent.shadowRoot.querySelector('input')
shadowInput.value = 'shadow value'
shadowInput.dispatchEvent(new Event('input'))
Источник: https://javascript.info/shadow-dom-events
Пример
// Create shadow dom inside <input-container>
customElements.define('input-container', class extends HTMLElement {
connectedCallback() {
const shadow = this.attachShadow({mode: 'open'});
shadow.innerHTML = `<div><input type="text" /></div>`;
}
});
// Programmatically update input value inside shadow DOM
const lightComponent = document.querySelector('input-container')
const shadowInput = lightComponent.shadowRoot.querySelector('input')
shadowInput.value = 'Shadow value'
shadowInput.dispatchEvent(new Event('input'))
<body>
<label>Input inside shadow DOM</label>
<input-container></input-container>
</body>