如何从后台脚本app
中的内容脚本app.js
访问变量background.js
?
以下是我尝试的方法(background.js
):
chrome.tabs.executeScript(null, { file: "app.js" }, function() {
app.getSettings('authorizeInProgress'); //...
});
这是我得到的:
以下是manifest.json
:
{
"name": "ctrl-vk",
"version": "0.1.3",
"manifest_version": 2,
"description": "Chrome extension for ctrl+v insertion of images to vk.com",
"content_scripts": [{
"matches": [
"http://*/*",
"https://*/*"
],
"js": ["jquery-1.9.1.min.js"
],
"run_at": "document_end"
}],
"web_accessible_resources": [
"jquery-1.9.1.min.js"
],
"permissions" : [
"tabs",
"http://*/*",
"https://*/*"
],
"background": {
"persistent": false,
"scripts": ["background.js"]
}
}
答案 0 :(得分:2)
为避免上述错误,请使用以下代码
if (tab.url.indexOf("chrome-devtools://") == -1) {
chrome.tabs.executeScript(tabId, {
file: "app.js"
}, function () {
if (app.getSettings('authorizeInProgress')) {
alert('my tab');
REDIRECT_URI = app.getSettings('REDIRECT_URI');
if (tab.url.indexOf(REDIRECT_URI + "#access_token") >= 0) {
app.setSettings('authorize_in_progress', false);
chrome.tabs.remove(tabId);
return app.finishAuthorize(tab.url);
}
} else {
alert('not my');
}
});
}
而不是
chrome.tabs.executeScript(null, {
file: "app.js"
}, function () {
if (app.getSettings('authorizeInProgress')) {
alert('my tab');
REDIRECT_URI = app.getSettings('REDIRECT_URI');
if (tab.url.indexOf(REDIRECT_URI + "#access_token") >= 0) {
app.setSettings('authorize_in_progress', false);
chrome.tabs.remove(tabId);
return app.finishAuthorize(tab.url);
}
} else {
alert('not my');
}
});
chrome://extensions/
页面也会触发chrome.tabs.onUpdated
事件,为避免这种情况,我们必须添加一个过滤器来跳过所有开发工具页面。答案 1 :(得分:1)
(会将此作为对已接受答案的评论提交,但仍然缺少所需的声誉)
您应该将tabId作为第一个参数提供给chrome.tabs.executeScript。否则,您可能会在请求URL和background.js针对错误页面执行executeScript后立即切换窗口/标签。
虽然后见之明相当明显,当我收到相同的错误消息“无法访问url的内容”chrome-devtools:// ..“时,它让我陷入循环,即使我的chrome.tabs.onUpdated事件处理程序正在检查页面用户请求在执行executeScript调用之前有一些特定的域名。
请记住,chrome.tabs.executeScript(null,..)在活动窗口中运行脚本,即使活动窗口可能是开发人员工具检查器。
答案 2 :(得分:0)
我们应该注意到,在清单cofig:
"content_scripts": [{
"matches": [
"http://*/*",
"https://*/*"
],
"js": ["jquery-1.9.1.min.js"
],
在“匹配”部分中,只有http,https匹配,因此如果您在页面中加载扩展程序,例如:'chrome:// extensions /'或'file:/// D:xxx',则表示错误会发生。
您可以使用网址“http://”在页面中加载您的扩展程序;或者在“匹配”数组中添加更多规则。