由于我最近经历了这个问题的挑战,我想分享一些我认为有价值的信息。
首先,Rob W 的答案是正确的。Shadow DOM 是解决这个问题的正确方法。然而,就我而言,我不仅需要 CSS 隔离,还需要 JavaScript 事件。例如,如果用户单击位于隔离 HTML 中的按钮会发生什么?仅使用 Shadow DOM 就变得非常丑陋,但我们有另一种 Web 组件技术,自定义元素,可以救援。除了在撰写本文时,chrome 中有一个错误会阻止 chrome 扩展中的自定义元素。请在此处 和此处查看我的问题以及此处的错误。
那么,我们将何去何从?我相信今天最好的解决方案是 IFrame,这就是我所采用的。shahalpk 链接的文章很棒,但它仅描述了该过程的一部分。我是这样做的:
首先,为您的隔离小部件创建一个 html 文件和 js 文件。这些文件中的所有内容都将在 iframe 中的隔离环境中运行。请务必从 html 文件中获取您的 js 文件。
//iframe.js
var button = document.querySelector('.my-button');
button.addEventListener('click', function() {
// do useful things
});
//iframe.html
<style>
/* css */
</style>
<button class='my-button'>Hi there</button>
<script src='iframe.js'></script>
接下来,在您的内容脚本中,在 javascript 中创建一个 iframe 元素。您需要在 javascript 中执行此操作,因为您必须使用 chrome.extension.getURL 才能获取 iframe html 文件:
var iframe = document.createElement('iframe');
iframe.src = chrome.extension.getURL("iframe.html");
document.body.appendChild(iframe);
就是这样。
需要记住的一件事:如果需要在 iframe 和其余内容脚本之间进行通信,则需要 chrome.runtime.sendMessage() 到后台页面,然后从后台页面返回 chrome.tabs.sendMessage到选项卡。他们不能直接交流。
编辑:我写了一篇博文,详细介绍了我在这个过程中学到的一切,包括一个完整的示例 chrome 扩展和许多指向不同信息的链接:
https://apitman.com/3/#chrome-extension-content-script-stylesheet-isolation
如果我的博客出现故障,这里是原始帖子的来源:
博文
示例源