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

Vic*_*tor 3 html javascript google-chrome delicious-api google-chrome-extension

我正在开发一个简单的链接共享扩展(插板,可读性,美味等),并且有一个关于如何正确处理上下文菜单项的问题.在我的非持久性背景页面中,我调用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  
Run Code Online (Sandbox Code Playgroud)

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

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

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

zac*_*lia 5

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

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

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


小智 5

如果您想要使用事件页面,即非持久性背景页面,则应该contextMenus.create在事件处理程序中注册上下文菜单runtime.onInstalled,因为这些上下文菜单注册仍然"持久".

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