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

use*_*524 5 google-chrome-extension

background.html:

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

content.js:

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

但是,它不起作用;

Uncaught TypeError: Cannot read property 'onMessage' of undefined 
Run Code Online (Sandbox Code Playgroud)

怎么做对了?

Rob*_*b W 11

你说"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}, '*');
});
Run Code Online (Sandbox Code Playgroud)

我认为你想要content.js用作真正的内容脚本,而不是注入脚本.如果您想了解注入的脚本和内容脚本之间的差异,请参阅Chrome扩展代码与内容脚本与注入脚本.