Chrome扩展程序:Chrome启动时仅执行一次背景页面

时间:2013-07-13 18:16:16

标签: google-chrome google-chrome-extension browser browser-extension

我正在使用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代码只运行一次?

3 个答案:

答案 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个,并查看它没有显式设置“持久”