2016-11-22 47 views
3

我试图从网页与扩展进行通信,反之亦然。API Web扩展,在浏览器和内容脚本之间进行通信

要做到这一点,我看着Mozilla的文档在这里:https://developer.mozilla.org/fr/Add-ons/WebExtensions/Content_scripts#Communicating_with_the_web_page

而且它有一个简单的例子,但我不能使它发挥作用。在网页的脚本,我有这样的:

// page-script.js 

var messenger = document.getElementById("from-page-script"); 

messenger.addEventListener("click", messageContentScript); 

function messageContentScript() { 
    window.postMessage({ 
    direction: "from-page-script", 
    message: "Message from the page" 
    }, "*"); 

在内容脚本页面的扩展:

// content-script.js 

window.addEventListener("message", function(event) { 
    if (event.source == window && 
     event.data.direction && 
     event.data.direction == "from-page-script") { 
    alert("Content script received message: \"" + event.data.message + "\""); 
    } 
}); 

我安装的扩展(作为一个暂时的,我上传了我的XPI文件)然后我使用API​​ WebExtensions的“调试”方法,并将一个断点放入侦听器,但每当我调用PostMessage时,该扩展都不会接收事件,断点从不触发。

这样可以在网页和扩展之间进行通信吗?还是有另一个?

+0

请编辑问题为题目:包括一个**完整的** [mcve],重复的问题。包括一个* manifest.json *,一些背景*和*内容脚本。寻求调试帮助的问题(“**为什么不是这个代码工作?”)必须包括:►期望的行为,►特定问题或错误*和*►在问题中重现问题所需的最短代码**本身**。没有明确问题陈述的问题对其他读者无益。请参阅:“**如何创建[mcve] **”,[我可以在此处询问哪些主题?](http://stackoverflow.com/help/on-topic)和[问]。 – Makyen

+0

您的代码适用于我的环境。有几件事你可以检查:尝试使用解压扩展而不是xpi,检查两个脚本是否加载。尝试从页面控制台运行'messageContentScript()'。 –

+0

非常感谢Anatoly Sazanov,我明白了。当我将Chrome扩展程序改编为Firefox扩展程序时,我使用了后台脚本。我没有看到它,但清单声明我的内容脚本为后台脚本,因此是错误。 – Thordax

回答

1

问题在于我的扩展。我将我的内容脚本声明为后台脚本。

所以,不要写成这样:

"background": { 
    "scripts": ["myscript.js"], 
    "persistent": true 
    }, 

您必须声明这样的脚本:

"content_scripts": [ 
    { 
     "matches": ["<all_urls>"], 
     "js": ["myscript.js"] 
    } 
    ] 
0

我遇到类似问题,并且这个问题对我来说是我打电话的

window.postMessage 

从iframe中的函数。我改成这个后

top.window.postMessage 

它开始工作。

相关问题