我有一个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
感谢您的任何提示或指示。
答案 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>