Javascript Chrome扩展上下文菜单创建多个子项&仅在弹出窗口打开时有效

Javascript Chrome扩展上下文菜单创建多个子项&仅在弹出窗口打开时有效,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我正在尝试在我的chrome扩展中实现一个上下文菜单,这样你就可以选择一个文本并右键单击来进一步处理它 菜单就在那里,部分有效,但我有两个问题: 出于某种原因,每次右键单击某个文本时,它都会创建子项,其范围在2到5之间。我猜这与扩展没有正确更新上下文菜单有关 第二个问题是,只有当弹出窗口打开时,下面的函数才能在单击时执行,否则它不会调用该函数。我的猜测是需要在后台做一些事情,目前所有的函数都位于popup.js中 function contextMenuClick(selectionText)

我正在尝试在我的chrome扩展中实现一个上下文菜单,这样你就可以选择一个文本并右键单击来进一步处理它

菜单就在那里,部分有效,但我有两个问题:

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

第二个问题是,只有当弹出窗口打开时,下面的函数才能在单击时执行,否则它不会调用该函数。我的猜测是需要在后台做一些事情,目前所有的函数都位于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);
  }
});

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

您的主要问题是,您的popup.js中有问题中显示的代码,而不是一个。这是属于后台脚本的代码

如何为此启用后台功能

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

背景:{ 脚本:[ background.js ] }, 我如何确保它不会创建这些子项,这是什么原因

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

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

为什么它只在弹出窗口打开时工作


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

我建议您阅读,或者阅读从那里链接的页面。它包含总体架构信息,这将有助于您了解事物的总体组织/完成方式。请选择主题中的问题:包括一个与问题重复的完整问题。包括manifest.json、一些后台脚本和内容脚本。寻求调试帮助的问题此代码为什么不起作用?必须包括:►想要的行为,►特定的问题或错误,以及►在问题本身中复制它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参见:如何创建和。