4

我正在为自己开发Google Chrome扩展程序。它为每个页面上图像的右键单击上下文菜单添加一个额外的菜单项。Chrome扩展程序开发:chrome.contextMenus为空

目前,我的扩建工程没有问题,但是当我检查控制台日志,我看到这个错误日志:

Uncaught TypeError: Cannot call method 'create' of undefined

与代码行:

var id = chrome.contextMenus.create({ 
     "title": title, "contexts": [context], 
     "onclick": genericOnClick 
    }); 

所以问题是,chrome.contextMenus来到null在这里。我发现它可能与权限有关,但我在我的manifest.json文件中拥有contextmenus权限。以下是清单文件中的权限块:

"permissions": [ 
    "contextMenus", 
    "notifications", 
    "<all_urls>" 
    ], 

而且,除此之外,我的扩展按原样工作。那么为什么我在日志中看到这个错误?我应该简单地添加一个空检查,如果chrome.contextMenus为空什么也不做?或者我应该等待它初始化(我不知道如何做btw - 没有使用旧式的while循环)?

这里的代码,导致此错误块:

var contexts = ["image"]; 
for (var i = 0; i < contexts.length; i++) { 
    var context = contexts[i]; 
    var title = "Do something"; 

    var id = chrome.contextMenus.create({ 
     "title": title, "contexts": [context], 
     "onclick": genericOnClick 
    }); 
} 

function genericOnClick(info, tab) { 
    // some stuff 
} 

我不是很熟悉JavaScript。我该如何解决这个问题?

在此先感谢

回答

11

chrome.contextMenus在内容脚本中未定义。

您可以使用Chrome控制台进行检查。

您需要background.js脚本创建上下文菜单项:

content.js

 var requestData = {"action": "createContextMenuItem"}; 
     //send request to background script 
     chrome.extension.sendRequest(requestData); 

background.js:

function onRequest(request, sender, callback){  
    if(request.action == 'createContextMenuItem'){ 
      var contextItemProperties = {}; 
      contextItemProperties.title = 'context menu item'; 
      chrome.contextMenus.create(contextItemProperties); 
    } 
} 

//subscribe on request from content.js: 
chrome.extension.onRequest.addListener(onRequest); 

我很奇怪,为什么文件没有提到您只能在后台页面中创建上下文菜单项。

您还需要在更改background.js中的代码后重新加载扩展。

+3

更新:sendRequest和onRequest现在已过时。你应该使用sendMessage和onMessage。请参阅[这里](https://developer.chrome.com/extensions/messaging) – Peter