如何在onStartup和onInstalled上添加Chrome扩展程序监听器?

Ben*_*rey 8 javascript google-chrome-extension

chrome.runtime API有,我可以用它来添加一个侦听上下文菜单的几个事件.目前我正在这样使用chrome.runtime.onStartup:

chrome.runtime.onStartup.addListener(function() {
  chrome.contextMenus.create({
    'title': 'Add: %s',
    'contexts': ['selection']
  });
});

chrome.contextMenus.onClicked.addListener(onClickHandler);
Run Code Online (Sandbox Code Playgroud)

问题是,chrome.runtime.onStartup当用户启动或重新启动Chrome chrome.runtime.onInstalled时,该功能将起作用,并且在首次安装或更新扩展程序或Chrome时可以使用.

如果我这样做onStartup,那么当我的扩展程序或Chrome下次更新时,我的上下文菜单就不会出现.如果我这样做onInstalled,那么在用户重新启动Chrome后,我的上下文菜单将不会保留.

我该如何处理这两种情况?

Xan*_*Xan 8

这实际上是一个有趣的问题,因为根据您使用的是事件页面还是持久性背景页面,行为会有所不同.

请注意,此答案特定于contextMenuAPI!

持久性背景页面

您应该简单地将代码放在顶层.

然后,每次加载扩展程序的后台页面时,它都会执行.

如果你有一个持久的背景页面,那就是你想要的:当扩展程序因任何原因启动时执行一次.

如果要确保不创建重复项,请在其中包含id属性create().

谷歌有相应的样本.

活动页面

在扩展的整个生命周期中,事件页面的加载频率远高于常规页面.无论如何,上下文菜单API需要对事件页面进行特殊处理.

首先,包括id属性contextMenus.create()是对事件页面的要求.此外,因为代码在空闲时卸载,所以必须使用chrome.contextMenus.onClicked而不是onclick属性.

文档建议使用onInstalled:

如果在安装或升级扩展时需要进行一些初始化,请收听该runtime.onInstalled事件.这是注册declarativeWebRequest规则,contextMenu条目和其他此类一次性初始化的好地方.

实际上,这就是他们在样本中所做的事情.

我测试了它,实际上通过重新启动扩展和浏览器来保持上下文菜单.但是,这种差异没有明确记录.

错误警报!鉴于Rob W对此错误的评论,如果扩展恰好被禁用,则该方法不是100%可靠.

  • 理论上,在 onInstalled 中注册上下文菜单项应该可行。实际上,这种情况并不总是发生:当更新扩展时禁用扩展时,旧的上下文菜单将被删除,但不会安装新的上下文菜单,因为在禁用扩展时不会调用 onInstalled (https://code .google.com/p/chromium/issues/detail?id=388231)。 (3认同)