我正在使用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,
});
答案 0 :(得分:7)
您的后台代码将执行多次 - 至少在每次浏览器启动/扩展重新加载时,并且最多每次Event page("persistent": false
)唤醒。
chrome.contextMenus.create
做了它在锡上的说法 - 创造了一个新的条目。每次运行。哪个会没问题,因为通常你想在扩展程序运行时设置所有内容,但上下文菜单条目实际上在扩展重新加载之间 - 所以它们不断堆积。
这里有两种方法:
为您的上下文条目(任意字符串)分配ID;在这种情况下,使用相同的ID再次调用create
将覆盖它引发错误,而不是创建新错误。
chrome.contextMenus.create({
title: "Search: %s",
id: "search",
contexts:["selection"],
onclick: getword,
});
无论如何,无论如何操作/引用该条目都是有用的。
在致电create
之前擦除您的上下文菜单条目:
chrome.contextMenus.removeAll(function() {
chrome.contextMenus.create({
// ...
});
});
这似乎是多余的,但这是确保扩展程序以前版本的“旧”上下文菜单条目不会延迟的最简单方法。
当然,你可以将两者结合起来。
还有几点评论:
如果您实际使用的是"persistent": false
活动页面,请注意不允许使用onclick
属性,因为扩展卸载会使其无效。更健壮的方法是使用chrome.contextMenus.onClicked
事件 - 菜单项的ID将传递给它以区分选项。
由于您很少需要更新上下文菜单项,因此最好将它们隐藏在相应的事件chrome.runtime.onStartup
和/或chrome.runtime.onInstalled
中。
但是,请注意,在非常罕见的情况下,您会自行处理错误:
在这种情况下, 事件都不会触发。这是bug。