为什么chrome.contextMenus会创建多个条目?

Nor*_*orx 4 javascript google-chrome contextmenu google-chrome-extension

我正在使用chrome.contextMenus.create函数在我的Chrome扩展程序中创建上下文菜单.但它创造了额外的选择.

我在我的manifest.json文件中给了权限,将此函数添加到我的background.js文件中并将其添加到我的manifest.json文件中.

为什么会这样?

function getword(info,tab) {
  console.log("Word " + info.selectionText + " was clicked.");
  chrome.tabs.create({  
    url: "http://www.google.com/search?q=" + info.selectionText,
  });           
}
chrome.contextMenus.create({
  title: "Search: %s", 
  contexts:["selection"], 
  onclick: getword,
});
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Xan*_*Xan 9

您的后台代码将执行多次 - 至少在每次浏览器启动/扩展重新加载时,并且最多每次一个事件页面("persistent": false)唤醒.

chrome.contextMenus.create做它在锡上说的 - 创造一个新的条目.每次运行.哪个会好的,因为通常你想在扩展程序运行时设置所有内容,但是上下文菜单条目实际上在扩展重新加载之间仍然存在 - 所以它们不断堆积.

这里有两种方法:

  1. 为上下文条目分配ID(这是一个任意字符串); 在这种情况下,create再次使用相同的ID进行调用覆盖它 引发错误,而不是创建新错误.

    chrome.contextMenus.create({
      title: "Search: %s",
      id: "search",
      contexts:["selection"], 
      onclick: getword,
    });
    
    Run Code Online (Sandbox Code Playgroud)

    无论如何,这对于稍后操纵/引用该条目是有用的.

  2. 在致电之前擦除您的上下文菜单条目create:

    chrome.contextMenus.removeAll(function() {
      chrome.contextMenus.create({
        // ...
      });
    });
    
    Run Code Online (Sandbox Code Playgroud)

    这似乎是多余的,但这是确保扩展程序以前版本中的"旧"上下文菜单条目不会延迟的最简单方法.

当然,你可以将两者结合起来.


还有几点评论:

  • 如果您实际上正在使用" "persistent": false事件"页面,请注意onclick不允许使用属性,因为它将被扩展卸载无效.更健壮的方法是使用chrome.contextMenus.onClicked事件 - 菜单项的ID将传递给它以区分选项.

  • 由于您很少需要更新上下文菜单项,因此最好将它们隐藏在相应的事件中,chrome.runtime.onStartup和/或chrome.runtime.onInstalled.

    但是,请注意,在非常罕见的情况下,您将自己打开一个错误:

    1. 扩展已安装但已禁用.
    2. 禁用时会发生更新.
    3. 此更新实际上应该更改其中任何一个事件的上下文菜单.
    4. 然后,再次启用扩展.

    在这种情况下,任何事件都不会发生.这是一个错误.

  • 伙计谢谢你,我添加了“chrome.contextMenus.removeAll(function()”和“id”,它现在工作正常。 (2认同)