开发者问题收集

chrome.extension.onMessage.addListener 无法读取未定义的属性“onMessage”

2012-10-17
21662

background.html 中:

chrome.tabs.query({active:true, currentWindow:true},function(tabs){
  chrome.tabs.sendMessage(tabs[0].id,"target.js");
});

content.js 中:

chrome.extension.onMessage.addListener(function(msg,sender,sendResponse){
  if (msg == "target.js"){
    extensionID = sender.id;
  }
});

但是,它不起作用;

Uncaught TypeError: Cannot read property 'onMessage' of undefined 

如何使其正确?

2个回答

您说“content.js 是一个内容脚本,它由另一个内容脚本注入到当前选项卡中。”。

这就是您的问题所在。注入的脚本在页面上下文中执行(就好像它们是由页面本身创建的一样),因此它们无法访问任何 Chrome 扩展 API。

您可以使用自定义事件或 postMessage 在页面和内容脚本之间进行通信,内容脚本又与后台页面进行通信。

例如,请参阅此基本示例:

// Injected script script
    addEventListener('message', function(event) {
        if (event.data && event.data.extensionMessage) {
            alert(event.data.extensionMessage);
        }
    });
    // Content script which injects the script:
    chrome.extension.onMessage.addListener(function(message) {
        postMessage({extensionMessage: message}, '*');
    });

我认为您想将 content.js 用作真正的内容脚本,而不是注入的脚本。如果您想了解注入脚本和内容脚本之间的区别,请参阅 Chrome 扩展程序代码 vs 内容脚本 vs 注入脚本

Rob W
2012-10-21

您似乎正在尝试对当前选项卡执行某些操作。您确定需要一条消息来执行该操作吗?我假设 background.html 是您的扩展程序的后台页面,content.js 是您的内容脚本。现在我跳过 background.html 页面,只需为我的后台页面运行一个 javascript 文件。我的 manifest.json 页面看起来会像这样。

  "background": {
     "scripts": [ "js/background.js"]
  },

在该页面中,我向我的后台页面添加了消息侦听器,因为这是我所知道的与 background.js 文件交互的唯一方法。但是,在您的情况下,是后台页面执行操作,因此您可以使用 chrome.tab 方法直接修改当前选项卡。除了 onMessage 之外,您还可以尝试使用 executeScript,其中 InjectDetails 是 javascript 或您想要执行的任何内容。

chrome.tabs.query({active:true, currentWindow:true},function(tabs){
         chrome.tabs.executeScript(tabs[0].id, InjectDetails);
});

有关更多信息,请参见 此处

Brantley Blanchard
2012-10-19