邮件未在Chrome扩展程序中从background.js发送到main.js

时间:2016-12-08 21:30:24

标签: 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"});
  });
});

我的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);

我的内容.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

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

1 个答案:

答案 0 :(得分:0)

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

您需要使用message passing代替。由于您有浏览器(或页面?)操作,因此background.js可能如下所示:

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

(对于未来的问题,Makyen是正确的:拥有mcve确实很有帮助。在这种情况下,这将是10行清单和两个最多5行的javascript文件。)< / p>