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 后,我的上下文菜单将不会保留。
我该如何处理这两种情况?
这实际上是一个有趣的问题,因为行为会有所不同,具体取决于您使用的是事件页面还是持久背景页面。
请注意,此答案特定于contextMenu
API!
持久后台页
您应该简单地将代码放在顶层。
然后,它将在每次加载扩展的后台页面时执行。
如果你有一个持久的后台页面,这正是你想要的:当扩展出于任何原因启动时执行一次。
如果要确保不创建重复的项目,请在create()
中包含id
属性。
谷歌有一个相应的样本。
活动页面
在扩展的整个生命周期中,事件页面的加载频率比常规页面高得多。无论如何,上下文菜单 API 需要对事件页面进行特殊处理。
首先,在contextMenus.create()
中包含id
属性是事件页面的要求。此外,由于代码在空闲时卸载,因此必须使用chrome.contextMenus.onClicked
而不是onclick
属性。
文档建议使用onInstalled
:
如果需要在安装或升级扩展时执行一些初始化,请侦听
runtime.onInstalled
事件。这是注册declarativeWebRequest
规则、contextMenu
条目和其他此类一次性初始化的好地方。
事实上,这就是他们在样本中所做的。
我对其进行了测试,实际上上下文菜单在重新启动扩展程序和浏览器时仍然存在。但是,这种差异没有明确记录。
错误警报!鉴于 Rob W 对此错误的评论,如果扩展碰巧被禁用,该方法不是 100% 可靠的。