Trong trường hợp của các thành phần web, có một vấn đề cơ bản khiến các tiện ích con được xây dựng từ HTML và JavaScript khó sử dụng.
Vấn đề : Cây DOM bên trong tiện ích con không được gói gọn trong phần còn lại của trang. Việc thiếu tính đóng gói này có nghĩa là biểu định kiểu tài liệu của bạn có thể vô tình áp dụng cho các phần bên trong tiện ích con; JavaScript của bạn có thể vô tình sửa đổi các phần bên trong tiện ích con; ID của bạn có thể trùng lặp với ID bên trong tiện ích con, v.v.
Shadow DOM giải quyết vấn đề đóng gói cây DOM .
Ví dụ: nếu bạn có đánh dấu như thế này:
<button>Hello, world!</button>
<script>
var host = document.querySelector('button');
var root = host.createShadowRoot();
root.textContent = 'こんにちは、影の世界!';
</script>
sau đó thay vì
Hello, world!
trang của bạn trông như thế nào
こんにちは、影の世界!
Không chỉ vậy, nếu JavaScript trên trang hỏi textContent của nút là gì, nó sẽ không nhận được “こんにちは、影の世界!”
, mà là “Hello, world!”
do cây con DOM dưới gốc bóng tối được đóng gói .
LƯU Ý : Tôi đã chọn nội dung ở trên từ https://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/ vì nó đã giúp tôi hiểu về Shadow DOM tốt hơn một chút so với các câu trả lời đã có ở đây. Tôi đã thêm nội dung có liên quan ở đây để nó giúp ích cho những người khác nhưng hãy xem liên kết để thảo luận chi tiết về cùng một.