gpt4 book ai didi

javascript - 为什么 chrome.contextMenus 创建多个条目?

转载 作者:搜寻专家 更新时间:2023-11-01 05:04:03 25 4
gpt4 key购买 nike

我正在使用 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,
});

enter image description here

最佳答案

您的后台代码将执行多次 - 至少在每次浏览器启动/扩展程序重新加载时,最多每次 Event page ("persistent": false) 醒来。

chrome.contextMenus.create做它在锡上所说的 - 创建一个新条目。每次运行。这很好,因为通常您希望在运行扩展程序时设置所有内容,但上下文菜单条目实际上在扩展程序重新加载之间持续存在 - 因此它们不断堆积。 p>

这里有两种方法:

  1. 为您的上下文条目分配一个 ID(这是一个任意字符串);在这种情况下,使用相同的 ID 再次调用 create覆盖它 引发错误,而不是创建新错误。

    chrome.contextMenus.create({
    title: "Search: %s",
    id: "search",
    contexts:["selection"],
    onclick: getword,
    });

    不管怎样,这对于以后操作/引用该条目很有用。

  2. 在调用 create 之前删除上下文菜单条目:

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

    这似乎是多余的,但这是确保您的扩展程序以前版本的“旧”上下文菜单条目不会留下的最简单方法。

当然,您可以将两者结合起来。


一些进一步的评论:

  • 如果您实际使用的是"persistent": false 事件页面,请注意不允许使用onclick 属性,因为它会因扩展卸载而失效.一种更可靠的方法是使用 chrome.contextMenus.onClicked 事件 - 菜单项的 ID 将传递给它以区分选项。

  • 由于您很少需要更新上下文菜单项,因此最好将它们隐藏在相应的事件中,chrome.runtime.onStartup和/或 chrome.runtime.onInstalled .

    但是,请注意,在非常罕见的情况下,您可能会遇到错误:

    1. 扩展已安装但已禁用。
    2. 在禁用时进行更新。
    3. 此更新实际上应该更改任一事件中的上下文菜单。
    4. 然后,再次启用扩展程序。

    在那些情况下,两个事件都不会触发。这是 bug .

关于javascript - 为什么 chrome.contextMenus 创建多个条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38190701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com