Расширение Chrome: правильное добавление пункта контекстного меню с непостоянной фоновой страницей
Я работаю над простым расширением для обмена ссылками (пробковая доска, удобочитаемость, вкусность и т. Д.), И у меня есть вопрос о том, как правильно работать с элементом контекстного меню. На моей непостоянной фоновой странице я звоню 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 и расширениях, я задаюсь вопросом, правильно ли я все делаю. Я предполагаю, что этот код верхнего уровня будет повторяться каждый раз, когда вызывается фоновая страница. Так что будут созданы избыточные вызовы для создания и addListener (и, следовательно, ошибка, которую я вижу, регистрируясь).
Я явно не могу выполнить очистку в ответ на приостановку, поскольку эти вызовы должны присутствовать, чтобы разбудить фоновый скрипт.
Должен ли я обращаться с вещами по-другому?
3 ответа
Вы можете справиться с этим одним из двух способов:
Вы можете добавить контекстное меню и слушателей при установке, используя:
chrome.runtime.onInstalled.addListener(function() { /* Add context menu and listener */ });
Вы можете удалить контекстное меню и прослушиватель, а затем повторно добавлять его при каждом вызове файла.
Если вы хотите использовать страницу события, то есть непостоянную фоновую страницу, как вы ее называете, вы должны зарегистрировать контекстное меню через contextMenus.create
в обработчике событий runtime.onInstalled
, поскольку эти регистрации контекстного меню "сохраняются" в любом случае.
Вы должны добавить функцию слушателя для contextMenus.onClicked
событие каждый раз, когда страница события перезагружается, хотя, поскольку регистрация вашего желания прослушать это событие сохраняется, в то время как сам обратный вызов обработчика этого не делает. Так вообще не звони contextMenus.onClicked.addListener
от runtime.onInstalled
, но с верхнего уровня или другого кода, который гарантированно будет выполняться при каждой загрузке страницы события.[ 1]
[решение больше не может иметь место, прочитайте комментарий]
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