6

我正在使用 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每次浏览器启动时代码只运行一次?

4

3 回答 3

19

您使用的是事件页面(background_page.js)。当浏览器检测到页面没有做任何事情时,事件页面被卸载。所以发生的事情是,当您打开一个新选项卡时,事件页面正在重新加载并再次从顶部开始执行。通过这种方式,chrome 能够让您的应用程序使用更少的内存并加快浏览器的速度。

如果您想解决问题,只需使用persistent:truewhich 将确保页面“持续”无限期或直到用户关闭浏览器。如果你真的想保持你的应用程序在内存方面的效率,你应该看看runtime.onSuspend每次你的事件页面卸载时调用的方法。这样,您可以在页面卸载之前保存内容,以便您可以从中断的地方继续。

于 2013-07-13T19:33:20.360 回答
6

更新:根据当前文档,您只需删除persistent密钥(无需将其更改为"persistent": true)。

这是一个活动页面

{
  "name": "My extension",
  ...
  "background": {
    "scripts": ["eventPage.js"],
    "persistent": false
  },
  ...
}

这是一个背景页面

{
  "name": "My extension",
  ...
  "background": {
    "scripts": ["background.js"]
  },
  ...
}
于 2017-03-18T00:59:25.377 回答
5

为了扩展 quackkkk 的答案,省略"persistent"manifest.json 中的键与将其设置为相同"persistent": true

证据:

docs中,它说:

保持后台脚本持续活动的唯一情况是扩展程序使用 chrome.webRequest API 来阻止或修改网络请求。webRequest API 与非持久性后台页面不兼容。

考虑到这一点,我们可以查看manifest.json扩展示例项目之一,No Cookies,它使用 webRequest API,并看到它没有明确设置“持久”

于 2019-11-06T04:04:35.743 回答