Контекстное меню в расширении Chrome, создающее нежелательные меню реплик

Вот мой код, который создает контекстное меню:

chrome.contextMenus.create({
    title: "copy '%s' to clipboard", 
    contexts: ["selection"], 
    onclick: function(info) { 
        wordObject[wordObject.length] = {
            word: info.selectionText,
            definition: " 'add definition' "
        };
        runArray();
        chrome.storage.sync.set({"myValue": wordObject});
    }
});

Проблема в том, что каждый раз, когда я обновляю страницу, в моем меню создается другой выбор.

ИЗМЕНИТЬ

Я как бы исправил это, но требует обновления страницы каждый раз, когда я нажимаю. Как-нибудь обойти это?

chrome.contextMenus.create({
    title: "copy '%s' to clipboard", 
    contexts: ["selection"], 
    onclick: function(info) { 
        wordObject[wordObject.length] = {
            word: info.selectionText,
            definition: " 'add definition' "
        };
        runArray();
        chrome.storage.sync.set({"myValue": wordObject});
        chrome.contextMenus.removeAll();
        location.reload(); // Refreshes page! Probably not good
    }
});

person rolandnsharp    schedule 14.08.2013    source источник


Ответы (2)


Всякий раз, когда вы хотите создать элемент меню, вы должны сделать один вызов contextMenus.create. Как правило, вы хотите создать пункты меню только один раз, во время инициализации вашего расширения. Кажется, вы звоните contextMenus.create каждый раз, когда загружаете веб-страницу. Не делай этого.

Возможно, у вас есть вызов contextMenus.create внутри какой-то функции, которая запускается при каждой загрузке страницы. Выньте его из этой функции и поместите туда, где он будет запускаться только один раз в течение загруженного времени жизни расширения. Например, запуска contextMenus.create внутри фонового скрипта, а не внутри какой-либо функции, должно быть достаточно.

Конечно, убедитесь, что куда бы вы ни переместили свой вызов на contextMenus.create, функция обратного вызова по-прежнему сохраняет область действия wordObject и runArray.

person apsillers    schedule 14.08.2013

Чтобы расширить ответ @apsillers, вот пример создания пункта контекстного меню при установке для непостоянного расширения (того, которое использует действие страницы вместо действия браузера), взятое из этот ответ:

chrome.runtime.onInstalled.addListener(function() {
    chrome.contextMenus.create({
        title: 'My menu',
        id: 'menu1', // you'll use this in the handler function to identify this context menu item
        contexts: ['all'],
    });
});

chrome.contextMenus.onClicked.addListener(function(info, tab) {
    if (info.menuItemId === "menu1") { // here's where you'll need the ID
        // do something
    }
});
person jtpereyda    schedule 05.12.2016