Javascript Chrome扩展消息未发送响应(未定义)
供将来参考:我通过将onMessage/sendMessage分别切换到后台脚本和内容脚本来解决这个问题。我不知道为什么这样做有效,但确实有效 在过去的三个小时里,我一直在试着调试这个程序——我正在构建一个chrome扩展,我发送的一条消息的响应是“未定义的”。我正在尝试获取用户所在选项卡的文本,并使用它进行一些分析 内容脚本:Javascript Chrome扩展消息未发送响应(未定义),javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,供将来参考:我通过将onMessage/sendMessage分别切换到后台脚本和内容脚本来解决这个问题。我不知道为什么这样做有效,但确实有效 在过去的三个小时里,我一直在试着调试这个程序——我正在构建一个chrome扩展,我发送的一条消息的响应是“未定义的”。我正在尝试获取用户所在选项卡的文本,并使用它进行一些分析 内容脚本: chrome.runtime.onMessage.addListener( function(request, sender, sendResponse) {
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.method == "collectText") {
sendResponse({data: document.body.innerText, method: "collectText"});
}
return true;
}
);
弹出脚本:
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {method: "collectText"}, function(response) {
if (response) {
txt = response.data;
console.log("response arrived");
console.log(txt);
} else {
console.log("No response.");
}
});
});
console.logs当前在那里,以便我知道数据是否返回(不是--“无响应”在每次脚本运行时都会被记录,并且txt
最终未定义)。我不确定这为什么不起作用(我在同一个脚本上尝试了许多变体,但都没有用)。我在扩展或我所在页面的控制台中没有收到任何错误。我应该使用背景脚本而不是在popup.js中编写所有内容吗
谢谢大家! 由于代码+,您可能会遇到错误: 你需要检查一下 属性获取有关错误的信息并进行修复
希望这会有所帮助 供将来参考:我通过将onMessage/sendMessage分别切换到后台脚本和内容脚本来解决这个问题。我不知道为什么会这样,但确实如此。如果异步返回答案,则可能会发生此类错误。 (尽管在您给出的示例中不可能发生这种情况)
//发送者
runtime.sendMessage(消息,响应=>{
如果(!响应)
错误(“这是一次失败:”,runtime.lastError.message);
});
//接受者
runtime.onMessage.addListener(异步(请求、发送方、发送响应)=>{
var response=等待回答(请求);
发送应答(应答);
});
//这个接收器也有同样的问题
runtime.onMessage.addListener((请求、发送方、发送响应)=>{
承诺某事(请求)。然后(回应=>{
发送应答(应答);
});
});
在这种情况下,您将看到以下错误:Unchecked runtime.lastError:消息端口在收到响应之前关闭
要修复它,必须从异步
onMessage
侦听器返回true
。请注意,返回承诺在chrome(,)上不起作用。您确定使用了所有必需的参数吗?我认为这里的选项不相关,所以我认为是。我没有在选项卡或弹出脚本上收到任何lastError
错误。Hm,能否尝试将弹出脚本作为后台页面脚本运行并检查结果?将脚本放在background.js中也不起作用。我将相同的代码与var txt=“hi”放在一起代码>在顶部,当我从popup.js调用txt时,我得到的是“hi”,而不是扩展应该从当前选项卡收集的文本。我刚刚用后台页面上的run检查了您的示例,它对我很有用。我所做的-我刚刚将setTimeout
添加到chrome.tabs.query
中,并使一个活动选项卡不是devtools
。可能您的问题是,在执行时,活动选项卡是devtools
或chrome://extensions
?使用此选项卡将无法正常工作。感谢此提示。。。我不得不点击“检查视图”来查看后台脚本生成的错误。我希望我能理解你的意思。在过去的两天里我也有同样的问题,我失去了生存的意志。。。
// According to the documentation of chrome.runtime.sendMessage, the
// callback is invoked without any arguments when an error occurs