最近我经历了这个问题的磨难,我想分享一些我认为有价值的信息。
首先,Rob W的答案是正确的。影子DOM是解决这个问题的正确方法。然而,在我的情况下,我不仅需要CSS隔离,还需要JavaScript事件。例如,如果用户单击存在于隔离HTML内部的按钮会发生什么?只使用Shadow DOM会变得非常丑陋,但是我们还有另一种Web组件技术——自定义元素来拯救。然而,截至本文撰写时,Chrome中存在一个错误,防止自定义元素在Chrome扩展程序中使用。请参见我在此处和此处以及这里的问题。
那么我们该怎么办呢?我认为今天最好的解决方案是IFrames,这也是我采用的方法。shahalpk链接的文章很棒,但它只描述了过程的一部分。以下是我的做法:
首先,为您的隔离小部件创建一个HTML文件和JS文件。这些文件内部的所有内容都将在IFrame中运行。请确保从HTML文件引用JS文件。
var button = document.querySelector('.my-button');
button.addEventListener('click', function() {
});
<style>
</style>
<button class='my-button'>Hi there</button>
<script src='iframe.js'></script>
接下来,在你的内容脚本中使用JavaScript创建一个iframe元素。你需要在JavaScript中这样做,因为你必须使用chrome.extension.getURL来获取你的iframe HTML文件:
接下來,在你的內容腳本中用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
如果我的博客消失了,这里是原始帖子的来源:
博客文章
示例源代码
style="prop:val!important"
将具有最高优先级 - 例如,请参见http://jsfiddle.net/rytkL/。 - Rob W