javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > 用JS获取内部DOM元素

网页中的shadow-root(open)是什么?如何用JS获取内部DOM元素?

作者:smiley121

你是否在项目中遇到过shadow-root(open),却无法用常规JS方法获取其内部元素?本文详细解释Shadow DOM的封装特性,教你如何通过shadowRoot属性访问隐藏的影子树,并操作内部DOM与样式,助你轻松应对组件化开发中的隔离问题

一、背景

项目中在DOM结构里遇到了shadow-root(open),用JS方法无法直接获取其内的DOM元素

二、shadow DOM

Web components 的一个重要属性是封装——可以将标记结构、样式和行为隐藏起来,并与页面上的其他代码相隔离,保证不同的部分不会混在一起,可使代码更加干净、整洁。其中,Shadow DOM 接口是关键所在,它可以将一个隐藏的、独立的 DOM 附加到一个元素上。

shadow-root包裹下的对象,不在全局的DOM树中,因此getElementById 等方法,获取不到包裹中的对象。

Shadow DOM 与普通 DOM 相同,但有两点区别:

通常,您创建 DOM 节点并将其附加至其他元素作为子项。 借助于 shadow DOM,您可以创建作用域 DOM 树,该 DOM 树附加至该元素上,但与其自身真正的子项分离开来。这一作用域子树称为影子树。被附着的元素称为影子宿主。

简单的意思就是可以用来独立建立一块渲染块,不受外层样式的影响,内层的样式也不影响外层的显示。

三、操作shadow-root内的元素

1.先获取shadow-root的父级节点,然后用shadowRoot取得这个父级节点的shadow块,然后就可以进行操作了

document.querySelector('#root').shadowRoot.querySelector('.chakra-portal')

2.在shadow块下面创建style标签,在里面添加样式

    let gtx = document.querySelector("#root");
    let style = document.createElement("style");
    style.innerHTML =
      ".grid_wrap { display: flex;justify-content: center;align-items: center;}";
    gtx.shadowRoot.appendChild(style);

四、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文