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

时间:2016-07-04 18:48:30

标签: javascript google-chrome google-chrome-extension contextmenu

我正在使用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,
});

enter image description here

1 个答案:

答案 0 :(得分:7)

您的后台代码将执行多次 - 至少在每次浏览器启动/扩展重新加载时,并且最多每次Event page"persistent": false)唤醒。

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

这里有两种方法:

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

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

    无论如何,无论如何操作/引用该条目都是有用的。

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

    chrome.contextMenus.removeAll(function() {
      chrome.contextMenus.create({
        // ...
      });
    });
    

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

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

    还有几点评论:

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

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

      但是,请注意,在非常罕见的情况下,您会自行处理错误:

      1. 扩展程序已安装但已禁用。
      2. 禁用时会发生更新。
      3. 此更新实际上应该更改其中任何一个事件中的上下文菜单。
      4. 然后,再次启用扩展程序。
      5. 在这种情况下, 事件都不会触发。这是bug