我打算将内容脚本中的消息发送到后台脚本中,并作为回应发送响应。
这是我在后台脚本中得到的:
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log("Message received");
if(request.activeStatusRequest == "disable"){
sendResponse({activeStatusUpdate: "disable"});
}else if(request.activeStatusRequest == "enable"){
sendResponse({activeStatusUpdate: "enable"});
}
return true;
});
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log("Message received");
if(request.activeStatusRequest == "disable"){
sendResponse({activeStatusUpdate: "disable"});
}else if(request.activeStatusRequest == "enable"){
sendResponse({activeStatusUpdate: "enable"});
}
return true;
});
这是我的内容脚本中提供的内容:
上面的其余代码按预期工作,除了没有控制台控制台运行内容脚本中的日志。但是,后台脚本中的控制台日志确实可以运行。
有人对我做错了什么有想法吗?printReviews.onclick = function(element) {
if(printReviews.classList.contains("activeButton")){
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.executeScript(
tabs[0].id,
{code: `${injectionLiteralGETURL}`}
);
});
toggleClasses(printReviews, "activeButton", "inactiveButton");
chrome.runtime.sendMessage({activeStatusRequest: "disable"}, function(response){
console.log("response received");
console.log(response.activeStatusUpdate);
});
}
else {
toggleClasses(printReviews, "inactiveButton", "activeButton");
chrome.runtime.sendMessage({activeStatusRequest: "enable"}, function(response){
console.log("response received");
console.log(response.activeStatusUpdate);
});
}
};
答案 0 :(得分:0)
如果您想尝试其他方法,则可以尝试在内容脚本中添加侦听器
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-script之间的回调,我更喜欢只播放消息,因为使用sendResponse时,它的工作方式会打开一个端口进行通信,但是如果发生更改(关闭选项卡,弹出窗口)关闭),您将遇到错误,因为端口也将关闭。 使用“完整发送消息的方式”,后台需要明确指定接收方标签。
我还建议您使用类型或某些唯一的动作属性,因为所有侦听器都将侦听所有动作。它将确定动作及其目的。 在这里,我只是在内容脚本中使用了一个开关,但是背景可以使用相同的逻辑。
也许这不是最好的做事方式,但对我来说很好。
希望这可以为您提供帮助