我正在尝试创建一个Firefox插件,当右键单击页面时添加一个上下文菜单项。
我正在使用这个MDN页面上的说明:
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/user_interface/Context_menu_items
根据指示,我写了一份清单。
{
"manifest_version": 2,
"name": "TestAddon",
"version": "0.1",
"description": "Test",
"icons": {
"48": "icons/icon-48.png"
},
"permissions": ["contextMenus"],
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["background-script.js"]
}
],
"browser_specific_settings": {
"gecko": {
"id": "sitetimelimiter@example.com",
"update_url": "https://example.com/updates.json"
}
}
}
…在background-script.js中,我使用MDN文章的指导方针编写了代码,并添加了一些额外的日志行用于调试:
console.log('mark 1');
browser.contextMenus.create({
id: "test-item",
title: "Test context-menu item",
contexts: ["all"],
}, onCreated);
console.log('mark 2');
browser.contextMenus.onClicked.addListener((info, tab) => {
switch (info.menuItemId) {
case "test-item":
alert("Test worked!");
break
}
});
console.log('mark 3');
据我所知,所有这些都符合MDN文档。
当我进入about:debugging并点击"Load Temporary Add-on…"为了测试插件,它加载插件时不会出现任何错误。
但是当我在浏览器中加载一个测试页面并右键单击该页时,测试项没有被添加到上下文菜单中。
看一下控制台,我可以看到"标记1"。显示,但"标记2"one_answers"标记3";永远不要被记录。这似乎表明这部分有问题:
browser.contextMenus.create({
id: "timer-reset",
title: "Reset page timer",
contexts: ["all"],
}, onCreated);
…但我已经检查了三遍,语法似乎与MDN文档完全一致。
我还看到其他MDN文档指示我使用browser.menu .create()而不是browser. contextmenu .create(),但无论我使用。menus还是。contextmenus,我都得到相同的结果
我错过了什么?
问题是您正在尝试访问内容脚本中的browser.contextMenus
。它们只能在后台脚本中使用。
从您链接到的MDN页面:
你可以在你的扩展的背景脚本中添加(和更新或删除)上下文菜单项。
所以你需要将这部分代码移动到后台脚本中,manifest.json:
"background": {
"scripts": ["background.js"]
}