【发布时间】:2016-04-15 11:13:17
【问题描述】:
我正在尝试创建一个 chrome 扩展,但由于某些原因,有时 chrome.runtime 对象似乎不完整,并且缺少很多方法(包括我想要的 onMessage)。
似乎有时有效,有时无效。我认为这可能是与时间相关的问题,但我不明白为什么我不能简单地在后台创建消息监听器?
我的后台脚本:
setTimeout(function () {
console.log("gogo!");
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.type == "tab") {
console.log("tab!");
sendResponse({status: "ok"});
}
}),
2
});
其中“chrome.runtime.onMessage”未定义。
谢谢!
Edit2:我构建了一个简单得多的原型,但它又失败了。现在我真的很困惑。这是我所拥有的:
$tree
.
├── manifest.json
├── src
│ ├── background.html
│ ├── background.js
│ └── test.js
└── vendor
└── jquery.js
2 directories, 5 files
manifest.json 文件:
{
"manifest_version": 2,
"name": "test",
"description": "test",
"version": "1.0",
"author": "test",
"homepage_url": "http://www.test.com",
"content_scripts": [
{
"run_at" : "document_idle",
"matches": ["https://www.google*"],
"js": ["vendor/jquery.js", "src/test.js"]
}
],
"background": {
"page": "src/background.html",
"persistent": false
},
"permissions": [
"tabs",
"https://www.google*"
]
}
background.html 文件:
<script src="../vendor/jquery.js"></script>
<script src="background.js"></script>
background.js 文件:
function run () {
console.log("gogo!");
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.type == "tab") {
console.log("tab!");
sendResponse({status: "ok"});
}
});
}
run();
test.js 文件:
'use strict';
run();
function run() {
var url = window.location.href;
// Error if no URI
if (!url) {
return 1;
}
var uriRe = /https:\/\/www\.google.*/;
var reParse = uriRe.exec(url);
if (!reParse) {
return 2;
}
chrome.runtime.sendMessage({type: "tab"}, function(response) {
console.log(response);
});
}
我在 OSX 上使用 Chrome 49.0.2623.112(64 位)。
编辑:这是失败时发生的屏幕截图:
我想再次准确地说它不会一直失败(可能有 50% 的时间?),这让它变得更加奇怪,让我相信在我不存在的地方存在某种“竞争”情况知道。
【问题讨论】:
-
你为什么要把它包装在一个超时时间里?
-
您的背景页面是活动页面吗? ("persistent": false set) 如果是这样,你不应该调用 setTimeout。如果是活动页面,请查看docs,因为有些事情需要注意。
-
@DanielHerr 这只是一个测试,因为我怀疑与时间相关的问题。似乎超时后效果更好,但我完全不确定。
-
@MichaelUpdike 感谢您的建议。我试图设置 "persistent": false 并且问题仍然是一样的。我尝试设置 "persistent": true 进行测试,结果还是一样。
-
您是否有任何 devtools 扩展正在运行?我知道扩展运行时页面被错误分类为非扩展页面的错误,该错误已在 Chrome 51(当前为 Chrome Beta)中修复 - crbug.com/544182
标签: javascript google-chrome google-chrome-extension background