我正在尝试在Chrome扩展程序中实现上下文菜单,以便您可以选择文本并右键单击以进一步处理它。
出于某种原因,每次右键单击某些文本时都会创建子项,它在2到5之间变化。我猜它与扩展有关,没有正确更新上下文菜单。
第二个问题是处理(所以下面的函数被执行onclick)仅在弹出窗口打开时才有效,否则它不会调用该函数。我的猜测是需要在后台完成某些操作,目前所有函数都位于popup.js中。
function contextMenuClick(selectionText) {
chrome.tabs.query({currentWindow: true, active: true}, function (tabs) {
var selection = selectionText;
console.log(selectionText);
//further processing
})
};
chrome.contextMenus.create({
title: "Push: %s",
contexts:["selection"],
onclick: function(info, tab) {
contextMenuClick(info.selectionText);
}
});
问题:如何确保它不会创建这些子项,原因是什么?为什么它只在弹出窗口打开时才有效?如何为此启用后台功能?
答案 0 :(得分:3)
您的主要问题是,您在 popup.js 而不是background script中显示了问题中显示的代码。这是属于您的后台脚本的代码。
如何为此启用后台功能?
您可以通过将background
键添加到 manifest.json 来定义后台脚本。对于名为 background.js 的脚本文件:
"background": {
"scripts": [
"background.js"
]
},
如何确保它不会创建这些子项,原因是什么?
每次执行chrome.contextMenus.create()
时,都会创建一个新的上下文菜单项。如果您创建了多个条目,它们将自动放置在带有扩展名称的右拉菜单中。鉴于此代码位于 popup.js 中,您可能每次打开弹出窗口时都创建一个新条目。你没有提供足够的代码让我们知道这实际上是发生了什么,但很可能。
确保仅通过创建单个上下文菜单项来创建右拉菜单和子项。最简单的方法之一是在后台脚本中调用chrome.contextMenus.create()
,执行一次,而不是每次打开弹出窗口。
为什么它只在弹出窗口打开时有效?
弹出窗口就像一个网页。如果没有显示,则不存在。因此,除非弹出窗口打开,否则您在上下文菜单contextMenuClick
事件侦听器中调用的函数onclick
不存在。如果它不存在,则无法调用。