如何让 chrome.contextMenus.onClicked.addListener 区分不同的上下文菜单 id?

How to make chrome.contextMenus.onClicked.addListener distinguish for different context menu ids?

在为 Chrome 开发基于上下文菜单的扩展时,我遇到了这样一种情况,即在循环中调用 chrome.contextMenus.onClicked.addListener 会为每个子上下文菜单项累积添加操作。

因此,当单击子上下文菜单时,它会触发所有子上下文菜单的事件侦听器,而不是被单击的上下文菜单。

     var parent;
     chrome.runtime.onInstalled.addListener(() => {
        parent = chrome.contextMenus.create({"title": "CCM", "id":"CCM", "contexts":["selection"]});
     });


     Object.keys(msgs).forEach(function(key) {
        chrome.runtime.onInstalled.addListener(() => {
        var createCM = chrome.contextMenus.create(
            {"title": "subcontextmenu"+key, "id":"scm"+key, "parentId": parent, "contexts":["selection"]});
        }); 
        chrome.contextMenus.onClicked.addListener(function(info,tab){openAction(info,tab,JSON.stringify(msgs[key]['msg']));}
        );  
     });

在上面的示例中,msgs 是一个 JSON 对象,其中包含单击每个子上下文菜单时要显示的消息。此外,msgs JSON 上下文必然会动态变化。因此,我们无法调整 openAction 来硬编码数字并关联消息。

希望我的问题很清楚。消除这种困惑的任何帮助对我来说都会节省很多时间。

对 onInstalled 和 onClicked 使用一个侦听器(它在其参数中提供 menuItemId)。

chrome.runtime.onInstalled.addListener(() => {
  chrome.contextMenus.create({title: 'CCM', id: 'CCM', contexts: ['selection']});
  Object.keys(msgs).forEach(key => {
    chrome.contextMenus.create({
      title: 'subcontextmenu' + key,
      id: 'scm' + key,
      parentId: 'CCM',
      contexts: ['selection'],
    });
  });
});

chrome.contextMenus.onClicked.addListener((info, tab) => {
  openAction(info, tab, JSON.stringify(msgs[info.menuItemId].msg));
});