Например, если вы используете веб-компоненты с LitElement, а затем пытаетесь использовать document.querySelector, и он ничего не находит в документе, но вы можете четко видеть это в инструментах разработчика. Очень раздражает, а затем вы ищете «веб-компоненты document.querySelector» и не получаете хороших результатов! ладно, сейчас все супер надоедает!

Причина в том, что веб-компоненты могут использовать новый ShadowDom, который инкапсулирует элементы DOM, которые могут быть присоединены к DOM. На самом деле вам не обязательно использовать ShadowDom, но это скорее правило, чем выброс.

Покажи, как ты задаешься вопросом о теневом мире?

Это сложнее, и вы не можете сделать это так же просто, как раньше, вам придется копать вручную и самостоятельно выбрасывать компоненты.

<div><my-component><button>Hello</button></my-component></div>

Мы хотим получить элемент кнопки.

Мы не можем этого сделать:

document.querySelector('button') // won't work

Нам нужно будет сделать это:

document.querySelector('my-component').shadowRoot.querySelector('button')

Итак, ShadowRoot является корневым для этого компонента, и этот querySelector будет работать внутри этого поддерева.

Я создал здесь пример, который вы можете увидеть:

Https://kevinsimper.github.io/queryselector-web-component/index.html

и исходный код здесь: