2012-10-17 71 views
4

财产 '的onMessage' 在background.htmlchrome.extension.onMessage.addListener无法读取的不确定

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 

如何纠正错误?

+1

你使用Chrome 19或更低? content.js是内容脚本吗? –

+1

我正在使用chrome 21. content.js是一个内容脚本,它被另一个内容脚本注入到当前选项卡。 – user1753524

回答

10

你说过“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 extension code vs Content scripts vs Injected scripts

+0

非常感谢你,我会稍后再试。在我的扩展中有两个脚本。一个是content.js,一个是target.js(这是一个真正的content.js)。并且是否注入content.js取决于target.js.And我需要在content.js中获得extensionID,所以我想在background.html和content.js之间交换消息。 – user1753524

+0

通过你所说的我用localStorage解决了这个问题的启发....非常感谢你!! ~~ – user1753524

0

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

查看更多关于HERE

+0

事实上,我只想在content.js.中获取我的扩展的id,但似乎在content.js.中没有允许chromeAPI,所以我尝试了这种方法,但它失败了..... content.js是一个内容脚本,它被注入到另一个内容脚本的当前标签我不知道它是否重要.... – user1753524