Chrome扩展程序中的上下文菜单可创建无用的副本菜单

时间:2013-08-14 13:11:04

标签: javascript google-chrome-extension contextmenu

这是我创建右键菜单的代码:

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
    }
});

2 个答案:

答案 0 :(得分:0)

每当您想要创建菜单项时,您应该只对contextMenus.create进行一次调用。通常,您只想在初始化扩展时创建一次菜单项。每次加载网页时,您似乎都在调用contextMenus.create。不要那样做。

您可能会在每个页面加载的某个函数内调用contextMenus.create。将它从该函数中取出并将其放置在仅为扩展的加载生命周期运行一次的地方。例如,在后台脚本中运行contextMenus.create,而不是在任何函数内运行,应该就足够了。

当然,请确保将呼叫转移到contextMenus.create的任何地方,回调功能仍会将wordObjectrunArray保留在范围内。

答案 1 :(得分:0)

扩展@ apsillers'回答,这是一个在安装时为非持久性扩展(使用页面操作而不是浏览器操作)创建上下文菜单项的示例,取自this answer

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
    }
});