如何在启动和安装时同时添加 Chrome 扩展程序侦听器?



chrome.runtime API 有一些事件,我可以使用它们将侦听器添加到上下文菜单。目前我正在使用这样的chrome.runtime.onStartup

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

问题是,当用户启动或重新启动Chrome时,chrome.runtime.onStartup将起作用,而chrome.runtime.onInstalled将在首次安装或更新扩展程序或Chrome时起作用。

如果我只执行onStartup,那么当我的扩展程序或 Chrome 下次更新时,我的上下文菜单将不存在。如果我只执行onInstalled,那么在用户重新启动 Chrome 后,我的上下文菜单将不会保留。

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

这实际上是一个有趣的问题,因为行为会有所不同,具体取决于您使用的是事件页面还是持久背景页面。

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

持久后台页

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

然后,它将在每次加载扩展的后台页面时执行。

如果你有一个持久的后台页面,这正是你想要的:当扩展出于任何原因启动时执行一次。

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

谷歌有一个相应的样本。

活动页面

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

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

文档建议使用onInstalled

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

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

我对其进行了测试,实际上上下文菜单在重新启动扩展程序和浏览器时仍然存在。但是,这种差异没有明确记录。

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

最新更新