让基本邮件传递到Chrome扩展程序中

时间:2014-02-18 20:17:14

标签: google-chrome-extension

我正在尝试将基本邮件传递到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

1 个答案:

答案 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,但这会向您的扩展程序中的的事件监听器发送消息内容脚本。 (因此您可以使用此方法向背景页面发送消息)