Chrome扩展程序上下文菜单会创建多个子项目&仅在Popup打开时有效

时间:2016-12-06 20:27:42

标签: javascript google-chrome-extension

我正在尝试在Chrome扩展程序中实现上下文菜单,以便您可以选择文本并右键单击以进一步处理它。

菜单在那里,部分有效,但我有两个问题: enter image description here

出于某种原因,每次右键单击某些文本时都会创建子项,它在2到5之间变化。我猜它与扩展有关,没有正确更新上下文菜单。

第二个问题是处理(所以下面的函数被执行onclick)仅在弹出窗口打开时才有效,否则它不会调用该函数。我的猜测是需要在后台完成某些操作,目前所有函数都位于popup.js中。

function contextMenuClick(selectionText) {

   chrome.tabs.query({currentWindow: true, active: true}, function (tabs) {
   var selection = selectionText;
   console.log(selectionText);
   //further processing
})
};

chrome.contextMenus.create({
  title: "Push: %s", 
  contexts:["selection"], 
  onclick: function(info, tab) { 
    contextMenuClick(info.selectionText);
  }
});

问题:如何确保它不会创建这些子项,原因是什么?为什么它只在弹出窗口打开时才有效?如何为此启用后台功能?

1 个答案:

答案 0 :(得分:3)

您的主要问题是,您在 popup.js 而不是background script中显示了问题中显示的代码。这是属于您的后台脚本的代码。

  

如何为此启用后台功能?

您可以通过将background键添加到 manifest.json 来定义后台脚本。对于名为 background.js 的脚本文件:

"background": {
    "scripts": [
        "background.js"
    ]
},
  

如何确保它不会创建这些子项,原因是什么?

每次执行chrome.contextMenus.create()时,都会创建一个新的上下文菜单项。如果您创建了多个条目,它们将自动放置在带有扩展名称的右拉菜单中。鉴于此代码位于 popup.js 中,您可能每次打开弹出窗口时都创建一个新条目。你没有提供足够的代码让我们知道这实际上是发生了什么,但很可能。

确保仅通过创建单个上下文菜单项来创建右拉菜单和子项。最简单的方法之一是在后台脚本中调用chrome.contextMenus.create(),执行一次,而不是每次打开弹出窗口。

  

为什么它只在弹出窗口打开时有效?

弹出窗口就像一个网页。如果没有显示,则不存在。因此,除非弹出窗口打开,否则您在上下文菜单contextMenuClick事件侦听器中调用的函数onclick不存在。如果它不存在,则无法调用。