我正在尝试将基本邮件传递到Chrome扩展程序中。有关SF的一些相关问题(最值得一提的是Basic google chrome extension message passing not working),但不幸的是,那里的建议对我来说似乎没有用。
Here's my manifest.json file:
{
"name": "Steve Screenshot",
"description": "Do something",
"version": "0.1",
"manifest_version": 2,
"content_scripts": [
{
"matches" : ["*://*/*"],
"js": ["simple.js"]
}
]
}
我的simple.js文件:
chrome.runtime.onMessage.addListener(function(request, sender, callback) {
console.log('message received');
});
// Invoke it!!!
chrome.runtime.sendMessage({
msg: 'whatever'
}, function(response) {
console.log('message sent');
});
在运行时,控制台日志显示“已发送消息”消息,但不显示“已接收消息”消息。据我所知,我是?正确的?调用chrome.runtime.onMessage / sendMessage。有谁评论?
谢谢, --Steve
答案 0 :(得分:0)
问题是您正在尝试使用chrome.runtime.sendMessage
向内容脚本发送消息。您无法使用runtime.sendMessage
向内容脚本发送消息,必须使用tabs.sendMessage
。 (阅读here)。
对邮件传递的一个很好的设置是使用后台页面作为邮件的“路由器”。当您需要将消息传递给内容脚本时,可以使用选项卡api从后台页面执行此操作。对于简单的测试,您可以在后台脚本中添加tabs.query
调用,以便向所有内容脚本发送消息,如下所示:
chrome.tabs.query({}, function(tabs) {
for(var i = 0; i < tabs.length; i++) {
chrome.tabs.sendMessage(tabs[i].id, {msg: 'whatever'});
}
}
将消息发送到单个内容脚本需要一些额外的逻辑,但是非常可行(一种方法是在后台页面中维护一些关联队列结构)。
另请注意,您可以在内容脚本中使用chrome.runtime.sendMessage
,但这会向您的扩展程序中的不的事件监听器发送消息内容脚本。 (因此您可以使用此方法向背景页面发送消息)