Chrome扩展程序:正确添加具有非持久性背景页面的上下文菜单条目

时间:2013-08-22 17:06:11

标签: javascript html google-chrome google-chrome-extension delicious-api

我正在开发一个简单的链接共享扩展(插板,可读性,美味等),并对如何正确处理上下文菜单项有疑问。在我的非持久性背景页面中,我调用chrome.contextMenus.createchrome.contextMenus.onClicked.addListener来设置/响应上下文菜单。

上下文菜单条目按预期工作。但是后台页面显示以下错误(在它开始之后和我使用该条目之前):

contextMenus.create: Cannot create item with duplicate id id_share_link at chrome-extension://.../share.js:52:30 lastError:29 set  

这让我意识到我不会删除项目或听众。对javascript和扩展知之甚少,我想知道我是否正确地做了一切。我假设这个顶级代码将在每次调用后台页面时重新执行。因此,对create和addListener进行冗余调用(因此我看到记录的错误)。

我显然无法进行清理以响应暂停,因为这些调用需要存在才能唤醒后台脚本。

我应该以不同的方式处理事情吗?

3 个答案:

答案 0 :(得分:5)

您可以通过以下两种方式之一处理:

  1. 您可以使用以下命令在安装时添加上下文菜单和侦听器:

    chrome.runtime.onInstalled.addListener(function() {
      /* Add context menu and listener */
    });
    
  2. 您可以删除上下文菜单和侦听器,然后在每次调用文件时重新添加它。

答案 1 :(得分:5)

如果你想使用事件页面,即非持久性背景页面,你可以通过{{1}注册一个上下文菜单在contextMenus.create的事件处理程序中,因为这些上下文菜单注册仍然“持久”。

每次重新加载事件页面时,您必须为runtime.onInstalled事件添加侦听器函数,因为您希望收听该事件的注册持续存在,处理程序回调本身没有。因此,通常不要从contextMenus.onClicked调用contextMenus.onClicked.addListener,而是从顶级或其他代码调用,每次事件页加载时都保证执行。 [ 1]

答案 2 :(得分:0)

[解决方案可能不再适用,请阅读评论]

如果您停用/启用扩展程序,则不会触发

runtime.onInstalled 我的解决方案是始终添加菜单项并吞下错误:

'use strict';

{

  let seqId = 0;

  const createMenuLinkEntry = (title, tab2url) => {

    const id = (++seqId).toString();

    chrome.contextMenus.create({
      id: id,
      title: title,
      contexts: ['browser_action'],
    }, () => {

      const err = chrome.runtime.lastError;
      if(err) {
        console.warn('Context menu error ignored:', err);
      }

    });

  };

  createMenuLinkEntry('Go to Google', (tab) => 'https://google.com');
  createMenuLinkEntry('Go to GitHub', (tab) => 'https://github.com');

} // namespace