crossrider 侧面板只是一个 iframe(您可以使用 js 注入的 html,但我有兴趣使用 iframe 来减少对页面其余部分的干扰)。我根本无法在浏览器扩展程序和 iframe 之间进行任何交互。
除非您可以进行一些基本的 JS 通信,否则我认为添加带有扩展名的侧面板毫无意义。在这种情况下,我想要控制扩展的 iframe 中的一些选项、复选框等。由于这个插件存在,我假设一定有办法。
理想情况下,我希望在子 iframe 中有一些基本的输入处理 js,并让它发回奇怪的保存/加载命令。答案真的是某种形式的消息传递吗?如果是这样,我应该在这里使用哪个 API?
我相信这是相关的:Accessing iframe from chrome extension
[编辑]
好的,所以我尝试了一些事情......
似乎预期的用途是将 iframe 的 html 内容托管在某处。考虑到它应该是本地的并且是扩展的一部分,有点奇怪。如果您想离线查看某些页面会发生什么?这很愚蠢,我将其视为一种选择。为什么要浪费资源来托管应该只在本地可用的东西。
另一种方法是提供侧边栏中的 HTML。请注意,此 HTML 不会放入 iframe 中。我喜欢 iframe 的想法,因为它使 CSS 和 JS 非常分离,因此页面和您的扩展程序之间的干扰最小。
所以我尝试通过
html
带有和 ID 的侧边栏属性创建一个 iframe,并在 100 毫秒延迟后使用myiframe.contentWindow.document.open/writeln/close()
. 这在 chrome 上运行良好,但在 Firefox 中失败并出现安全错误(The operation is insecure
onopen()
)。另一种方法是通过
src
url 提供 iframe 内容(对于侧边栏,我使用url
属性的数据地址):Html code as IFRAME source 而不是 URL。这在 Firefox 中有效,但在 chrome 中导致 CORS 错误:The frame requesting access has a protocol of "http", the frame being accessed has a protocol of "data". Protocols must match.
和Warning: Blocked a frame with origin "http://localhost" from accessing a cross-origin frame. Function-name: appAPI.message.addListener
这些 CORS 问题让我觉得非常愚蠢。我所有的代码都来自同一个扩展,注入到同一个页面。没有发生交叉起源,我创造了该死的东西。如果我有能力改变原点,那么它首先是不安全的,所以为什么要打扰。