javascript - chrome 扩展中的背景和内容脚本之间难以传递消息
问题描述
我正在尝试从内容脚本向后台脚本发送消息,并发送响应作为回报。
这是我在后台脚本中得到的:
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);
});
}
};
上述代码的其余部分按预期工作,除了内容脚本中没有控制台日志运行。但是,后台脚本中的控制台日志确实会运行。有人对我做错了什么有任何想法吗?
解决方案
如果你想尝试另一种方法,你可以尝试在内容脚本中添加一个监听器
内容.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;
}
});
背景.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);
}
}
要玩弹出/背景/内容脚本之间的回调,我更喜欢只玩消息,因为在使用 sendResponse 时,它的工作方式会打开一个端口进行通信,但如果有什么变化(标签关闭,弹出关闭),您将遇到错误,因为该端口也将被关闭。使用“全发消息方式”,后台需要明确定位到receiver tab。
我还建议您使用类型或某些独特的动作属性,因为所有侦听器都会侦听所有动作。它将识别操作及其目的。这里我只是在内容脚本中使用了一个开关,但后台可以使用相同的逻辑。
也许这不是最好的做事方式,但对我来说效果很好。
希望这可以帮到你
推荐阅读
- arrays - 如果单词以其中一个后缀结尾,则标记 1
- asp.net-core - 是否有针对 ASP.NET Core 的不同引导类的指南?
- xamarin.forms - Xamarin 中的砌体列表样式
- apache-spark - Spark CSV:解析由 Ascii æ (Hex E6) 分隔的文件
- python - 即使我下载了较新版本的python,我似乎也没有 pip
- c# - 使用 Stack 机器用 Brouncer 公式逼近 PI
- laravel - 如何在 Laravel 中使用 Bulma 创建 Select2 多个值
- c++ - 未定义对“sqlite3_open”的引用。我没主意了
- java - 为什么乘法后我的乘积结果为 0
- mysql - 哪个是更好的做法:“检查主 ID 是否存在然后跳过”或“插入忽略”?