所以我有一个内容脚本,其中的事件触发了一个“启动”脚本的消息,我用它来创建一个带有本地html文件的选项卡,并将相同的消息/变量传递给该选项卡。然后,选项卡应根据变量加载指定的数据。它在大约50%的时间内按预期工作,使我相信它是一个同步性问题。我可能不会以正确的方式解决这个问题,但这是我能靠自己解决的最好方法。
内容脚本(script.js):
function openHistory(event) {
var account = $(/*selector*/).html();
chrome.runtime.sendMessage(account);
}
启动脚本(launch.js):
chrome.runtime.onMessage.addListener(function(account) {
chrome.tabs.create({url: 'background.html'}, function(tab) {
chrome.tabs.sendMessage(tab.id, account);
});
});
HTML脚本(background.js):
chrome.runtime.onMessage.addListener(function(account) {
loadPage(account);
});
function loadPage(account) {
chrome.storage.sync.get(account, function(data) {
// Do stuff with DOM
});
}
清单:
{
"manifest_version": 2,
"name": "Extension",
"version": "1.0",
"permissions": ["storage", "tabs"],
"background": {
"scripts": ["launch.js"],
"persistent": false
},
"content_scripts": [{
"js": ["jquery.js", "script.js"]
}]
}
更新:我在launch.js中为tabs.sendMessage的回调添加了“alert(chrome.runtime.lastError.message)”,每当它不起作用时,我就会“无法建立连接。接收端不存在。“
答案 0 :(得分:5)
我的猜测是chrome.tabs.create
使用的回调实际上是在标签准备就绪时触发,而不是在其内容已加载时触发。我无法分辨,因为此方法的documentation没有说明何时触发回调。
要解决此问题,最好让新打开的后台标签向其祖先发送一条消息 - 正如您所知,启动脚本已经启动并运行 - 说“向我发送详细信息”,这一点你然后触发chrome.tabs.sendMessage(tab.id, account);
如果这有意义吗?
以下内容尚未经过测试,只是猜测可行的方法。显然,仔细观察可能会使用MessageSender
来计算消息是否来自后台脚本 - 而不是使用对象属性。但是我更喜欢用我自己的代码来具体说明这些事情:
HTML脚本(background.js):
chrome.runtime.sendMessage({from: 'background'});
启动脚本(launch.js):
chrome.runtime.onMessage.addListener(function(obj, sender) {
if ( obj && obj.from == 'background' ) {
chrome.tabs.sendMessage(sender.tab.id, obj);
}
else {
chrome.tabs.create({url: 'background.html' });
}
});