Javascript 在chrome扩展中,在后台和内容脚本之间传递消息很困难
我正在尝试将一条消息从内容脚本发送到后台脚本,并发送一个响应 这是我的背景脚本中的内容:Javascript 在chrome扩展中,在后台和内容脚本之间传递消息很困难,javascript,google-chrome,google-chrome-extension,chrome-runtime,Javascript,Google Chrome,Google Chrome Extension,Chrome Runtime,我正在尝试将一条消息从内容脚本发送到后台脚本,并发送一个响应 这是我的背景脚本中的内容: 这是我在内容脚本中得到的: 上述代码的其余部分按预期工作,除了运行内容脚本时没有控制台日志。不过,后台脚本中的控制台日志确实会运行。 有人知道我做错了什么吗?如果您想尝试其他方法,可以尝试在内容脚本中添加一个侦听器 Content.js chrome.runtime.onMessage.addListener( function(request, sender, sendResp
这是我在内容脚本中得到的:
上述代码的其余部分按预期工作,除了运行内容脚本时没有控制台日志。不过,后台脚本中的控制台日志确实会运行。
有人知道我做错了什么吗?如果您想尝试其他方法,可以尝试在内容脚本中添加一个侦听器 Content.js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log("Message received from background", response.type, response.activeStatusUpdate);
switch(request.type){
case 'SomeFirstAction'
break;
case 'SomeSecondAction'
break;
}
});
Background.js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log("Message received");
if(request.activeStatusRequest == "disable"){
sendMessageToCurrentTab({type: 'SomeFirstAction', activeStatusUpdate: "disable"});
}else if(request.activeStatusRequest == "enable"){
sendMessageToCurrentTab({type: 'SomeSecondAction', activeStatusUpdate: "enable"});
}
// return true; -> not needed with that method
});
function sendMessageToCurrentTab(message){
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, message);
}
}
要在popup/background/content脚本之间播放回调,我更喜欢只播放消息,因为当使用sendResponse时,它的工作方式会打开一个端口进行通信,但是如果发生更改(选项卡关闭、弹出关闭),您将有一个错误,因为端口也将关闭。
使用“完全发送消息方式”,后台需要清楚地指向receiver选项卡
我还建议您使用一个类型或一些独特的操作属性,因为所有侦听器都将侦听所有操作。它将确定行动及其目的。
在这里,我只是在内容脚本中使用了一个开关,但是后台可以使用相同的逻辑
也许这不是最好的做事方式,但对我来说效果很好
希望这能帮助您1)您不能在内容脚本中使用chrome.tabs-那里只允许使用3或4个基本API。将其移动到背景脚本。2) 如果不从异步调用调用sendResponse,则不需要“return true”。3) 开始使用devtools调试器,您可以在代码中设置断点,逐步执行它,并检查变量、状态和DOM。4) 编辑内容脚本代码时,请确保重新加载上的两个扩展名chrome://extensions 页面和网页,以便注入新代码。5) 如果这没有帮助,请在问题中添加manifest.json。@wOxxOm感谢您的回答。我现在不在我的电脑上,明天将进行更改。1) 那很有趣。代码“injectionLiteralGETURL”的注入似乎完全按照预期工作。可能我对内容脚本是什么有错误的想法?我的“内容脚本”的文件名是popup.js,它是一个链接到我的popup.html的脚本。2)谢谢,我会更改它。3)我以前使用过它,但似乎无法确定它是如何出错的。我会再试一次。4)是的,一直在这样做。5)我回到电脑后会添加manifest.json。谢谢你的帮助。确实是一个浏览操作弹出脚本不是一个内容脚本,因此您可以在那里使用chrome.tabs。那么我将无法在这两个脚本之间传递消息吗?假设您的背景脚本确实是一个背景脚本(在manifest.json中正确声明),你可以。一个常见的错误是在同一个popup.html中加载背景脚本。由于弹出脚本可以做任何事情,所以不清楚为什么需要背景脚本。
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log("Message received from background", response.type, response.activeStatusUpdate);
switch(request.type){
case 'SomeFirstAction'
break;
case 'SomeSecondAction'
break;
}
});
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log("Message received");
if(request.activeStatusRequest == "disable"){
sendMessageToCurrentTab({type: 'SomeFirstAction', activeStatusUpdate: "disable"});
}else if(request.activeStatusRequest == "enable"){
sendMessageToCurrentTab({type: 'SomeSecondAction', activeStatusUpdate: "enable"});
}
// return true; -> not needed with that method
});
function sendMessageToCurrentTab(message){
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, message);
}
}