Что такое теневой корень

В Инструментах разработчика Google Chromes я вижу #shadow-root под тегом <html lang="en">. что он делает и для чего он используется? Я не вижу его в Firefox и в IE; только в Chrome, это особая особенность?

Если я открою его, он отобразит <head> и <body> и ссылку рядом с именем reveal, нажав, он указывает на <head> и <body>, ничего больше.

Ответ 1

Это специальный индикатор, который существует Shadow DOM. Они существовали годами, но разработчикам до недавнего времени разработчикам никогда не предоставляли API. У Chrome была эта функция некоторое время, другие браузеры все еще догоняют. Он может быть переключен в настройках DevTools в разделе "Элементы". Снимите флажок "Показать тень пользователя DOM". Это, по крайней мере, скроет любые созданные DOM-объекты Shadow (например, элементы select.) Я сразу же не уверен, влияет ли это на созданные пользователем, такие как пользовательские элементы.

Они появляются в таких вещах, как iframe, где у вас есть отдельное дерево DOM, вложенное внутри другого.

The Shadow DOM просто говорит, что какая-то часть страницы имеет внутри нее собственную DOM. Стили и сценарии могут быть охвачены внутри этого элемента, поэтому выполняемые в нем операции выполняются только на этой границе.

Это одна из основных частей, необходимых для веб-компонентов для работы. Это новая технология, позволяющая разработчикам создавать собственные инкапсулированные компоненты, которые разработчики могут использовать, как и любой другой элемент HTML.

Ответ 2

В качестве примера Shadow DOM, если на веб-странице есть тег <video>, он отображается как один тег в основной DOM, но если вы включите Shadow DOM, вы сможете увидеть видеоплеер HTML (проигрыватель DOM).


Тень DOM


Это объясняется в этой статье, http://webcomponents.org/articles/introduction-to-shadow-dom/

Ответ 3

В случае с веб-компонентами существует фундаментальная проблема, которая затрудняет использование виджетов, построенных из HTML и JavaScript.

Проблема: дерево DOM внутри виджета не инкапсулировано с остальной частью страницы. Это отсутствие инкапсуляции означает, что ваша таблица стилей документа может случайно применяться к частям внутри виджета; ваш JavaScript может случайно изменить части внутри виджета; Ваши идентификаторы могут совпадать с идентификаторами внутри виджета и так далее.

Shadow DOM решает проблему инкапсуляции дерева DOM.

Например, если у вас была разметка вот так:

<button>Hello, world!</button>
<script>
var host = document.querySelector('button');
var root = host.createShadowRoot();
root.textContent = 'こんにちは、影の世界!';
</script>

тогда вместо

Hello, world!

ваша страница выглядит

こんにちは、影の世界!

Мало того, что если JavaScript на странице спросит, что такое кнопки textContent, он не получит "こんにちは、影の世界!" , но "Hello, world!" потому что поддерево DOM под теневым корнем инкапсулировано.

ПРИМЕЧАНИЕ. Я взял вышеупомянутое содержание с https://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/, так как это помогло мне понять теневой DOM немного лучше, чем ответы, которые уже были здесь. Я добавил соответствующий контент, чтобы он помог другим, но посмотрите на ссылку для подробного обсуждения того же.