我正在使用Chrome扩展程序,我的清单加载了一个背景页面:
...
"background": { "scripts": ["background_page.js"], "persistent": false },
...
.js代码如下所示:
var once = false;
window.addEventListener("load", function () {
if ( once == true ) { return; }
alert( 'test' );
once = true;
}, false);
这似乎工作正常,但我想每次浏览器启动时只运行一次background_page.js代码。
现在,我不知道为什么,但代码执行不止一次。起初我以为每次打开新标签时都会执行,但情况并非如此。一旦我启动浏览器就会出现警报,然后如果我快速打开一个新标签警报就不会出现,但如果我等待大约1分钟左右并打开一个新标签,则会再次出现警报。
如何确保每次浏览器启动时background_page.js代码只运行一次?
答案 0 :(得分:9)
您使用的是Event Page(background_page.js)。当浏览器检测到页面没有执行任何操作时,将卸载事件页面。所以发生的事情是,当您打开一个新选项卡时,将重新加载“事件”页面并再次从顶部开始执行。通过这种方式,chrome可以让您的应用使用更少的内存并加快浏览器的速度。
如果您想解决问题,只需使用persistent:true
,这将确保页面无限期“持久”或直到用户关闭浏览器。如果你真的希望保持你的应用程序内存有效,你应该看看每次你的事件页面卸载时调用的runtime.onSuspend
方法。这样,您可以在页面卸载之前保存内容,以便您可以从中断的位置继续。
答案 1 :(得分:4)
更新:根据current documentation,你只需要删除" persistent"密钥(无需将其更改为"persistent": true
)。
...
这是一个活动页面:
{
"name": "My extension",
...
"background": {
"scripts": ["eventPage.js"],
"persistent": false
},
...
}
...
这是背景页:
{
"name": "My extension",
...
"background": {
"scripts": ["background.js"]
},
...
}
答案 2 :(得分:1)
要扩展quackkkk的答案,在manifest.json中省略"persistent"
键等同于将其设置为"persistent": true
证明:
在docs中,它表示:
保持后台脚本始终处于活动状态的唯一机会是 如果扩展程序使用chrome.webRequest API阻止或修改网络 要求。 webRequest API与非持久性API不兼容 背景页面。
请牢记这一点,我们可以签出使用WebRequest API的扩展示例项目manifest.json中的No Cookies个,并查看它没有显式设置“持久”