我近期在写一个 chrome 插件,这个插件会操作页面上的 dom 元素,但是插件自身有时候也会对页面上的 dom 元素产生影响。这给我带来的不小的麻烦。
查资料的时候发现了 shadowRoot,看上去很好使。唯一要解决的就是将 vue 代码挂载到 shadowRoot 中的元素上
![]()
创建 shadow-root 的 dom
1 2 3 4 5
| let shadowRootDom = document.createElement('div'); shadowRootDom.setAttribute('id', 'shadow-root'); document.body.appendChild(shadowRootDom); const shadow = document.querySelector('#shadow-root').attachShadow({mode: 'open'});
|
在 shadow-root 插入 <div id="chrome-extension-root"></div>
方便vue去挂载
1 2 3 4 5
| let chromeExtensionRootDom = document.createElement('div'); chromeExtensionRootDom.setAttribute('id', 'chrome-extension-root'); shadow.appendChild(chromeExtensionRootDom); let getChromeExtensionRootDom = shadow.querySelector('#chrome-extension-root')
|
使用vue挂载
1 2 3 4 5
| new Vue({ el: getChromeExtensionRootDom, render: (h) => h(root), });
|