chrome.extension.onMessage.addListener 无法读取未定义的属性“onMessage”
在
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 是一个内容脚本,它由另一个内容脚本注入到当前选项卡中。”。
这就是您的问题所在。注入的脚本在页面上下文中执行(就好像它们是由页面本身创建的一样),因此它们无法访问任何 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 注入脚本
。
您似乎正在尝试对当前选项卡执行某些操作。您确定需要一条消息来执行该操作吗?我假设 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);
});
有关更多信息,请参见 此处 。