Google chrome extension 未在Chrome扩展中从background.js发送到main.js的消息

Google chrome extension 未在Chrome扩展中从background.js发送到main.js的消息,google-chrome-extension,Google Chrome Extension,我有一个Chrome扩展,我需要点击扩展按钮来调用我的主上下文,这样它就可以访问gmail.js。我的background.js是: chrome.browserAction.onClicked.addListener(function(tab) { chrome.browserAction.onClicked.addListener(function(tab) { chrome.tabs.sendMessage(tab.id, {greeting: "hello"}); }

我有一个Chrome扩展,我需要点击扩展按钮来调用我的主上下文,这样它就可以访问gmail.js。我的background.js是:

chrome.browserAction.onClicked.addListener(function(tab) {
  chrome.browserAction.onClicked.addListener(function(tab) {
      chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
  });
});
我的main.js是:

var gmail;

function refresh(f) {
  if ((/in/.test(document.readyState)) || (typeof Gmail === undefined)) {
    setTimeout('refresh(' + f + ')', 10);
  } else {
    f();
  }
}

var main = function() {
  gmail = new Gmail();  

  chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    console.log(sender.tab ?  "from a content script:" + sender.tab.url : "from the extension");
  });
}

refresh(main);
我的content.js是:

var j = document.createElement('script');
j.src = chrome.extension.getURL('jquery-1.10.2.min.js');
(document.head || document.documentElement).appendChild(j);

var g = document.createElement('script');
g.src = chrome.extension.getURL('gmail.js');
(document.head || document.documentElement).appendChild(g);

var s = document.createElement('script');
s.src = chrome.extension.getURL('main.js');
(document.head || document.documentElement).appendChild(s);
我的manifest.json是:

{
  "name": "Test",
  "version": "1.0",
  "description": "Test Gmail chrome extension",
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "browser_action": {
    "default_title": "Export current Gmail message",
    "default_icon": "email_16x16.png"
  },
  "content_scripts": [
    {
      "matches": ["https://mail.google.com/*"],
      "js": ["content.js"]
    }
  ],
  "web_accessible_resources": [
    "jquery-1.10.2.min.js",
    "background.js",
    "gmail.js",
    "main.js"
  ],
  "manifest_version": 2
}
加载扩展时,我收到以下错误:

Uncaught TypeError: Cannot read property 'addListener' of undefined
at <anonymous>:9:27
at refresh (chrome-extension://lnndcckhmkllogdhmmlhfdoehbfgipdj/main.js:14)
at <anonymous>:1:1
Uncaught TypeError:无法读取未定义的属性“addListener”
时间:9:27
刷新时(铬)-extension://lnndcckhmkllogdhmmlhfdoehbfgipdj/main.js:14)
时间:1:1

感谢您提供的任何提示或提示。

window.postMessage
发布到当前窗口,对于背景脚本,该窗口是一个不可见的背景html窗口。由于这不是您正在查看的页面,因此不会收到

你需要改用。由于您有一个浏览器(或页面?)操作,因此您的
background.js
可能看起来像:

chrome.browserAction.onClicked.addListener(函数(选项卡){
sendMessage(tab.id,{问候语:“你好”});
});

(对于未来的问题,Makyen是正确的:有一个。在本例中,这将是10行清单和两个最多5行的javascript文件。)

window.postMessage
发布到当前窗口,对于背景脚本来说,这是一个不可见的背景html窗口。由于这不是您正在查看的页面,因此不会收到

你需要改用。由于您有一个浏览器(或页面?)操作,因此您的
background.js
可能看起来像:

chrome.browserAction.onClicked.addListener(函数(选项卡){
sendMessage(tab.id,{问候语:“你好”});
});

(对于未来的问题,Makyen是正确的:有一个。在本例中,这将是10行清单和两个最多5行的javascript文件。)

我要求有一个,等等,因为问题中不清楚脚本运行的上下文。虽然main.js更可能是一个内容脚本,但也可能是一个页面脚本,甚至是其他脚本。main.js已经从其他来源获取消息这一事实意味着更为复杂。因此,我认为最常见的可能性比“正常”可能性小。还有一个问题可能表明这个问题与其他任何关于如何从后台脚本到内容脚本进行通信的问题是不同的。至于这个答案:最好解释一下OP需要一个
chrome.runtime.onMessage
侦听器,以接收从
chrome.tabs.sendMessage()发送的消息
。此类消息不是从
窗口接收的。addEventListener(“消息”,…)
。仅供参考:使用名为background.js的脚本并不保证它实际上是一个后台脚本。这个名字很有可能,但不能保证。例如,我最近遇到一个问题,a.切换到消息传递,但仍然出现错误。谢谢你的帮助。我请求了一个等等,因为从这个问题上看,脚本运行的上下文并不清楚。虽然main.js更可能是一个内容脚本,但也可能是一个页面脚本,甚至是其他脚本。main.js已经从其他来源获取消息这一事实意味着更为复杂。因此,我认为最常见的可能性比“正常”可能性小。还有一个问题可能表明这个问题与其他任何关于如何从后台脚本到内容脚本进行通信的问题是不同的。至于这个答案:最好解释一下OP需要一个
chrome.runtime.onMessage
侦听器,以接收从
chrome.tabs.sendMessage()发送的消息
。此类消息不是从
窗口接收的。addEventListener(“消息”,…)
。仅供参考:使用名为background.js的脚本并不保证它实际上是一个后台脚本。这个名字很有可能,但不能保证。例如,我最近遇到一个问题,a.切换到消息传递,但仍然出现错误。谢谢你的帮助。完成了,谢谢你的提示。你编辑的唯一不好的地方是我现在的答案毫无意义。尽量避免那样做。如果有必要,你可以问一个新问题,然后再参考这个问题。另外,
content.js
中有什么?添加了content.js,这可能是关键@Teepeemm,很抱歉,我现在意识到我应该问一个不同的问题。@Scott,是的,content.js是缺少的部分。“这让你的问题变得很清楚了。”“蒂皮,我对这个问题的变化持两种看法。是的,一般来说,不应更改使答案无效的问题。然而,在这种情况下,我的感觉是你在回答这个问题时跳了枪。即使是问题的初稿也明显地暗示了你在回答中所作的假设是错误的可能性。这就是我关于需要a的说明的原因,你在答复中重申了这一点。另一个问题是,无论哪种方式,这个问题都可能以重复(至少大体上是重复)而告终。完成了,谢谢你的提示。你编辑的唯一不好的地方是我现在的答案毫无意义。尽量避免那样做。如果有必要,你可以问一个新问题,然后再参考这个问题。另外,
content.js
中有什么?添加了content.js,这可能是关键@Teepeemm,很抱歉,我现在意识到我应该问一个不同的问题。@Scott,是的,content.js是缺少的部分。“这让你的问题变得很清楚了。”“蒂皮,我对这个问题的变化持两种看法。是的,一般来说,不应更改使答案无效的问题。然而,在这种情况下,我的感觉是你在回答这个问题时跳了枪。即使是问题的初稿也明显地暗示了你在回答中所作的假设是错误的可能性。这就是为什么