Chrome扩展程序无法为特定页面加载ContextMenu

时间:2015-04-28 14:21:17

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

我从Google的contextMenu示例开始。它使用适用于所有页面的背景页面创建上下文菜单。

我正在寻找一种仅为页面创建上下文菜单的方法。我尝试定位的示例页面是任何Reddit页面。

我的manifest.json

{
  "name": "Context Menus Sample",
  "description": "Shows some of the features of the Context Menus API",
  "version": "0.6",
  "permissions": ["contextMenus"],

  "manifest_version": 2,
  "content_scripts": [
    {
      "matches": ["http://www.reddit.com/*"],
      "js": ["sample.js"]
    }
  ]
}

sample.js与Google示例提供的from the original contextMenu example project相同。它最初是一个后台页面脚本,我已将其移动到内容脚本部分,因此它只会加载指定的(Reddit)URL。

sample.js中的示例代码:

var checkbox1 = chrome.contextMenus.create(
  {"title": "Checkbox1", "type": "checkbox", "onclick": checkboxOnClick}
);

所以我的困惑在于当你在reddit.com上时为什么没有出现上下文菜单。我的印象是,当网址匹配时,sample.js会触发。

2 个答案:

答案 0 :(得分:2)

can't use (most) of the chrome.* APIs from a content script。您的sample.js已运行,但API调用失败。

相反,您应该将其移回后台脚本,并阅读chrome.contextMenus.create()上的文档。

具体来说,您可以传递documentUrlPatterns参数来限制上下文菜单的显示位置:

var checkbox1 = chrome.contextMenus.create({
    "title": "Checkbox1",
    "type": "checkbox",
    "onclick": checkboxOnClick,
    "documentUrlPatterns": ["*://*.reddit.com/*"]
});

答案 1 :(得分:1)

<强>更新

我回到了仅包含上下文菜单的原始manifest.json

{
  "name": "Context Menus Sample",
  "description": "Shows some of the features of the Context Menus API",
  "version": "0.6",
  "permissions": ["contextMenus"],
  "background": {
    "scripts": ["sample.js"]
  },
  "manifest_version": 2
}

我继续更改创建第一个菜单项的sample.js行(请注意,这是一次学习经历):

从:

for (var i = 0; i < contexts.length; i++) {
  var context = contexts[i];
  var title = "Test '" + context + "' menu item";
  var id = chrome.contextMenus.create({"title": title, "contexts":[context],"onclick": genericOnClick});
  console.log("'" + context + "' item:" + id);
}

到此(仅更改var id部分:

for (var i = 0; i < contexts.length; i++) {
  var context = contexts[i];
  var title = "Test '" + context + "' menu item";
  var id = chrome.contextMenus.create({
    "title": title,
    "contexts": [context],
    "onclick": genericOnClick,
    "documentUrlPatterns": ["*://*.reddit.com/*"]
  });
  console.log("'" + context + "' item:" + id);
}

<强>结论

上述更改现在只有在reddit页面内时才能访问第一个菜单项。因此,从这一点开始计算我的扩展的其余部分并不难。谢谢你们的帮助。

我为编辑们的糟糕格式道歉。我是这个网站的新手,对扩展程序不熟悉,不幸的是在正常睡眠时间之后的几个小时。我会尽量不再让你受到那种愚蠢。