- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
似乎允许网站与扩展程序通信的 externally_connectable 功能仍处于开发 channel 中,并且还不稳定。在我等待此功能稳定的同时,还有其他方法可以让特定网站与我的扩展程序通信吗? chrome 扩展开发人员传统上是如何做到的?
最佳答案
感谢 Rob W 为我指明了 HTML5 消息传递的方向。为了其他 chrome 扩展开发人员的利益,我正在写关于我试图解决的一般问题以及最终有效的解决方案。
我正在制作一个 chrome 扩展,可以通过弹出播放器控制标签上的音乐播放。当用户在弹出播放器上单击播放/暂停/等时,扩展程序应该能够将该消息传达给网页并返回说明操作是否已完成的响应。
我的第一种方法是将内容脚本注入(inject)音乐播放器页面。但问题是,内容脚本在“沙盒”中运行,无法访问页面上的原生 JavaScript。因此,内容脚本(就其本身而言)毫无用处,因为虽然它可以从扩展程序接收命令,但它无法对网页本身进行任何更改。
对我有利的一件事是播放音乐的网站属于我,所以我可以将我想要的任何 javascript 放在那里,并从服务器提供它。这正是我使用的优势:我创建了另一个 javascript 文件,该文件将驻留在网站上并通过页面的窗口对象与上述内容脚本进行通信(即 HTML5 消息传递 )。这只是因为内容脚本和javascript文件都存在于同一个网页中并且可以共享页面的窗口对象。感谢 Rob W 向我指出了这种能力。以下是页面上的 javascript 文件如何通过 window 对象启动与内容脚本的连接的示例:
content_script.js(通过扩展注入(inject) xyz.com):
window.addEventListener("message", function(event) {
if(event.data.secret_key &&
(event.data.secret_key === "my_secret_key") &&
event.data.source === "page"){
if(event.data.type){
switch(event.data.type) {
case 'init':
console.log("received connection request from page");
window.postMessage({source: "content_script", type: 'init',
secret_key: "my_secret_key"}, "*");
break;
}
}
}
}, false);
window.postMessage({source: "page", type: 'init',
secret_key: "my_secret_key"}, "*");
window.addEventListener("message", function(event) {
if(event.data.secret_key &&
(event.data.secret_key === "my_secret_key") &&
event.data.source === "content_script"){
if(event.data.type){
switch(event.data.type) {
case 'init':
console.log("connection established");
break;
}
}
}
}, false);
关于google-chrome-extension - chrome 扩展 - externally_connectable 的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18154599/
我正在尝试使用新的 API WebExtension 将 Chrome 扩展转换为 Firefox。 除了在网页中使用 chrome.runtime.sendMessage() 之外,一切正常。目标是
似乎允许网站与扩展程序通信的 externally_connectable 功能仍处于开发 channel 中,并且还不稳定。在我等待此功能稳定的同时,还有其他方法可以让特定网站与我的扩展程序通信吗?
我是一名优秀的程序员,十分优秀!