W przypadku komponentów internetowych istnieje fundamentalny problem, który sprawia, że widżety zbudowane z HTML i JavaScript są trudne w użyciu.
Problem : drzewo DOM wewnątrz widżetu nie jest oddzielone od reszty strony. Ten brak hermetyzacji oznacza, że arkusz stylów dokumentu może przypadkowo zastosować się do części wewnątrz widżetu; Twój JavaScript może przypadkowo zmodyfikować części wewnątrz widżetu; Twoje identyfikatory mogą pokrywać się z identyfikatorami wewnątrz widżetu i tak dalej.
Shadow DOM rozwiązuje problem enkapsulacji drzewa DOM .
Na przykład, jeśli masz takie znaczniki:
<button>Hello, world!</button>
<script>
var host = document.querySelector('button');
var root = host.createShadowRoot();
root.textContent = 'こんにちは、影の世界!';
</script>
to zamiast
Hello, world!
Twoja strona wygląda
こんにちは、影の世界!
Nie tylko to, jeśli JavaScript na stronie pyta o zawartość textContent przycisku, nie otrzyma “こんにちは、影の世界!”
, ale “Hello, world!”
dlatego, że poddrzewo DOM w katalogu głównym cienia jest hermetyzowane .
UWAGA : Powyższa treść pochodzi z https://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/, ponieważ pomogła mi lepiej zrozumieć shadow DOM niż odpowiedzi już tutaj. Dodałem tutaj odpowiednią treść, aby pomóc innym, ale spójrz na link do szczegółowej dyskusji na ten temat.