0%

将 vue 代码挂载到 shadowRoot 中的元素上

我近期在写一个 chrome 插件,这个插件会操作页面上的 dom 元素,但是插件自身有时候也会对页面上的 dom 元素产生影响。这给我带来的不小的麻烦。

查资料的时候发现了 shadowRoot,看上去很好使。唯一要解决的就是将 vue 代码挂载到 shadowRoot 中的元素上

创建 shadow-root 的 dom

1
2
3
4
5
// 创建 shadow-root 的 dom
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
// 在 shadow-root 插入 `<div id="chrome-extension-root"></div>` 方便vue去挂载
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
// 使用vue挂载
new Vue({
el: getChromeExtensionRootDom,
render: (h) => h(root),
});