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

标签 google-chrome-extension

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 

如何使它正确?

最佳答案

您说“content.js 是一个内容脚本,它被另一个内容脚本注入(inject)到当前选项卡中。”。
这就是你的问题。注入(inject)的脚本在页面上下文中执行(就好像它们是由页面本身创建的一样),因此它们无法访问任何 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作为一个真正的内容脚本,而不是一个注入(inject)的脚本。如果您想了解注入(inject)脚本和内容脚本之间的区别,请参阅 Chrome extension code vs Content scripts vs Injected scripts .

关于google-chrome-extension - chrome.extension.onMessage.addListener 无法读取未定义的属性 'onMessage',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12936953/

相关文章:

google-chrome-extension - Chrome插件: Accessing named pipes on Windows

jquery - Chrome 扩展 : refuse header "date" in ajax request

javascript - 为什么从 Chrome 扩展的内容脚本动态注入(inject) jQuery 后我无法使用它?

javascript - 通过服务器消息单击按钮

javascript - chrome.declarativeContent.onPageChanged.removeRules(未定义,函数(){})不工作

javascript - 如何在没有开发控制台的情况下在 Chrome 中运行 JS 代码片段?

javascript - 如何在选项卡的主窗口对象上定义属性?

javascript - Chrome 扩展更改 popup.html 文本

javascript - 检查 Chrome 中是否存在具有确切 ID 的 Tab 的最佳方法

google-chrome-extension - 运行 chrome 扩展的 identity.getAuthToken 时出现错误 'Service has been disabled for this account'