Javascript 有没有办法为上下文菜单项(google chrome扩展)定义自己的上下文

Javascript 有没有办法为上下文菜单项(google chrome扩展)定义自己的上下文,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我有一个简单的chrome扩展,我的目标是悬停在任何img或视频或音频标签上,通过右键单击img、视频或音频,获得带有扩展项的上下文菜单 所以问题是,当一些img位于div内部或后面时,我无法获取上下文菜单项,因为它与上下文不匹配。视频和音频有时也会发生同样的事情。我的问题是,有没有什么方法可以编写自己的上下文,而不是使用谷歌的“图像”、“视频”、“音频” 我已经有了一些正在工作的扩展,所以我需要用一些图片来解决这个问题 var contextMenuItem = { "id": "pr

我有一个简单的chrome扩展,我的目标是悬停在任何img或视频或音频标签上,通过右键单击img、视频或音频,获得带有扩展项的上下文菜单

所以问题是,当一些img位于div内部或后面时,我无法获取上下文菜单项,因为它与上下文不匹配。视频和音频有时也会发生同样的事情。我的问题是,有没有什么方法可以编写自己的上下文,而不是使用谷歌的“图像”、“视频”、“音频”

我已经有了一些正在工作的扩展,所以我需要用一些图片来解决这个问题

var contextMenuItem = {
    "id": "printData",
    "title": "print",
    "contexts": ["image", "audio", "video"]
};

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

chrome.contextMenus.onClicked.addListener(function(mediaData){
    if (mediaData.menuItemId == "printData") {
        console.log(mediaData)
    }
});

因此,我想要的是当我在页面上显示任何图像时,上下文菜单项的显示。因为现在它可能有50%的时间是有效的。谢谢

不,无法添加自定义上下文

您可以使用单独的
id
“页面”
上下文中注册一个附加菜单项,并在内容脚本中使用
鼠标向下
事件侦听器动态显示/隐藏它。监听器将在
contextmenu
事件之前触发,如果事件的目标包含img/media,监听器将通知后台脚本。后台脚本将使用chrome.contextMenus API切换菜单项

:

:

不过,这个简化的示例将全局切换所有选项卡的菜单项。Chrome API无法切换每个选项卡的菜单,因此您可能希望实现的最接近的方法是使用documentUrlPatterns来指定选项卡URL,但这是一种边缘情况,可能不值得追求。

可能重复
// true means 'useCapture' mode (the first event phase)
window.addEventListener('mousedown', e => button === 2 && beforeContextMenu(e), true);
window.addEventListener('keydown', e => {
  if (e.key === 'ContextMenu' || 
      e.key === 'F10' && e.shiftKey && !e.altKey && !e.ctrlKey && !e.metaKey) {
    beforeContextMenu(e);
  }
}, true);

function beforeContextMenu(e) {
  const el = !e.target.matches('img, video, audio') &&
             e.target.querySelector('img, video, audio');
  chrome.runtime.sendMessage({
    contextMenu: el ? el.currentSrc || el.src : '',
  });
}
chrome.runtime.onMessage.addListener((message, sender) => {
  if (message.contextMenu) {
    chrome.contextMenus.create({
      id: 'printData:page',
      title: 'print',
      contexts: ['page'],
    }, ignoreChromeError);
  } else if (message.contextMenu === '') {
    chrome.contextMenus.remove('printData:page', ignoreChromeError);
  }
});

chrome.runtime.onInstalled.addListener(() => {
  chrome.contextMenus.create({
    id: 'printData',
    title: 'print',
    contexts: ['image', 'audio', 'video'],
  }, ignoreChromeError);
});

chrome.contextMenus.onClicked.addListener(e => {
  if (e.menuItemId.startsWith('printData')) {
    console.log(e);
  }
});

function ignoreChromeError() {
  return chrome.runtime.lastError;
}