8

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 

如何使它正确?

4

2 回答 2

14

您说“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 注入脚本

于 2012-10-21T15:22:40.410 回答
-1

看起来您正在尝试对当前选项卡执行一些操作。你确定你需要一个消息来做到这一点?我假设 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);
});

在这里查看更多信息。

于 2012-10-19T19:04:47.787 回答