我正在开发一个简单的链接共享扩展(插板,可读性,美味等),并对如何正确处理上下文菜单项有疑问。在我的非持久性背景页面中,我调用chrome.contextMenus.create
和chrome.contextMenus.onClicked.addListener
来设置/响应上下文菜单。
上下文菜单条目按预期工作。但是后台页面显示以下错误(在它开始之后和我使用该条目之前):
contextMenus.create: Cannot create item with duplicate id id_share_link at chrome-extension://.../share.js:52:30 lastError:29 set
这让我意识到我不会删除项目或听众。对javascript和扩展知之甚少,我想知道我是否正确地做了一切。我假设这个顶级代码将在每次调用后台页面时重新执行。因此,对create和addListener进行冗余调用(因此我看到记录的错误)。
我显然无法进行清理以响应暂停,因为这些调用需要存在才能唤醒后台脚本。
我应该以不同的方式处理事情吗?
答案 0 :(得分:5)
您可以通过以下两种方式之一处理:
您可以使用以下命令在安装时添加上下文菜单和侦听器:
chrome.runtime.onInstalled.addListener(function() {
/* Add context menu and listener */
});
您可以删除上下文菜单和侦听器,然后在每次调用文件时重新添加它。
答案 1 :(得分:5)
如果你想使用事件页面,即非持久性背景页面,你可以通过{{1}注册一个上下文菜单在contextMenus.create
的事件处理程序中,因为这些上下文菜单注册仍然“持久”。
每次重新加载事件页面时,您必须为runtime.onInstalled
事件添加侦听器函数,因为您希望收听该事件的注册持续存在,处理程序回调本身没有。因此,通常不要从contextMenus.onClicked
调用contextMenus.onClicked.addListener
,而是从顶级或其他代码调用,每次事件页加载时都保证执行。 [ 1]
答案 2 :(得分:0)
[解决方案可能不再适用,请阅读评论]
如果您停用/启用扩展程序,则不会触发 runtime.onInstalled
我的解决方案是始终添加菜单项并吞下错误:
'use strict';
{
let seqId = 0;
const createMenuLinkEntry = (title, tab2url) => {
const id = (++seqId).toString();
chrome.contextMenus.create({
id: id,
title: title,
contexts: ['browser_action'],
}, () => {
const err = chrome.runtime.lastError;
if(err) {
console.warn('Context menu error ignored:', err);
}
});
};
createMenuLinkEntry('Go to Google', (tab) => 'https://google.com');
createMenuLinkEntry('Go to GitHub', (tab) => 'https://github.com');
} // namespace