我希望我的Google扩展程序在Google Chrome窗口打开后立即开始执行。我的background.js中有以下代码:
if (window.Notification) {
setInterval( function() { callAutomate(); }, 60000 );
}
function callAutomate() {
// Code to automate hello-hello.com
}
清单文件如下 -
{
"name" : "Hello.co Extension",
"version" : "1.1",
"description" : "Say Hello",
"background" :
{
"scripts": ["background.js"],
"persistent": false
},
"page_action" :
{
"default_icon" : "hello-19.png",
"default_title": "Hello World",
"default_popup": "popup.html"
},
"content_scripts": [
{
"matches": ["https://www.hellohello.com/*"],
"js": [
"content.js",
"webDB.js"
]
}
],
"permissions": [
"tabs",
"storage",
"unlimitedStorage",
"webNavigation",
"notifications",
"https://www.hellohello.com/"
],
"options_page": "options.html",
"icons" : {
"48" : "hello-48.png",
"128" : "hello-128.png"
},
"manifest_version": 2,
"web_accessible_resources": [
"hello-48.png"
]
}
这是我的问题callAutomate();函数似乎只在我观察background.js的控制台日志时调用。但是,扩展的预期行为是调用callAutomate();从Google Chrome窗口打开时起每隔一分钟运行一次。
任何有关解释性代码的帮助都将受到高度赞赏。
答案 0 :(得分:3)
正如Chrome extension documentation中所述,有两种类型的背景页面:
您使用的是第二个,与manifest.json文件中的"persistent": false
一起指定,
因此,当您正常加载页面时,后台代码将不会自行执行
我非常确定当您在后台页面上使用开发人员工具("观察控制台")时,页面将被打开"在控制台保持打开状态时不会关闭。
删除"persistent": false
您的代码将被执行。
但正如文档中所建议的那样,您应该尽可能多地使用事件页面,以便查看lifetime documentation以查看与后台页面通信的不同方式,从而执行所需的代码。 / p>
答案 1 :(得分:2)
这是因为清单中的"persistent": false
。
这描述了一个Event page,也就是说,如果Chrome可以闲置超过几秒钟,Chrome就可以随意卸载该页面,只跟踪已注册的事件处理程序。
事件页面的注释明确提到:
如果您的扩展程序使用
window.setTimeout()
或window.setInterval()
,请切换为使用警报API。如果事件页面关闭,基于DOM的计时器将无法兑现。
如果您打开后台页面的Dev Tools窗口,它将不会被卸载,从而导致代码正常执行。
您可以切换为使用chrome.alarms
API,但在此之前,仔细阅读活动页面文档。您需要了解所有限制:例如,由于页面已卸载,因此变量中的所有本地状态都将丢失。如果您需要保持状态,则需要使用存储API。
如果您的目的过于复杂,请移除"persistent": false
以恢复为正常的背景页。