我正在编写Chrome扩展程序,但发送响应不起作用。
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if(!request.method){
return false;
}
if(request.method=='postList' && request.post_list){
// alert(1);
a_facebook_api.getPostFromDB(request.post_list, function(data){
alert(data);
sendResponse(data);
});
} else if(request.method=='postAdd' && request.post_data){
a_facebook_api.addPostToDB(request.post_data, function(data){
sendResponse(data);
});
}
return true;
}
);
chrome.runtime.sendMessage({method: "postList",post_list: post_list}, function(response) {
alert(response);
});
功能警报数据有效。它为我提供了JSON格式的数据。但是,警报(响应)不显示任何消息。任何人都可以给我一些想法,为什么它不起作用?
提前谢谢!
答案 0 :(得分:11)
您尚未说明此代码在内容脚本或背景页面中的天气。通过查看,我认为它是内容脚本的一部分。
我在我自己的一个扩展中尝试了你的代码并且它提醒了“[object Object]”,当你警告一个不是字符串或数值的变量时会发生这种情况。如果您将警报数据更改为“response.responseData”,它将从后台页面提醒您标记为“responseData”的值。
由于它没有为您提醒任何事情,我认为正在侦听该消息的脚本没有正确响应。
我让代码正常工作。 这是内容脚本:
//Document ready
window.onload = function() {
alert('Ready');
//Send a message
sendMessage();
}
//Get message from background page
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
//Alert the message
alert("The message from the background page: " + request.greeting);//You have to choose which part of the response you want to display ie. request.greeting
//Construct & send a response
sendResponse({
response: "Message received"
});
});
//Send message to background page
function sendMessage() {
//Construct & send message
chrome.runtime.sendMessage({
method: "postList",
post_list: "ThePostList"
}, function(response) {
//Alert the message
alert("The response from the background page: " + response.response);//You have to choose which part of the response you want to display ie. response.response
});
}
这是后台脚本:
//Get message from content script
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
//Alert the message
alert('The message from the content script: ' + request.method);//You have to choose which part of the response you want to display ie. request.method
//Construct & send a response
sendResponse({
response: "Message received"
});
}
);
//Send message to content script
function sendDetails(sendData) {
//Select tab
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
//Construct & send message
chrome.tabs.sendMessage(tabs[0].id, {
greeting: sendData
}, function(response) {
//On response alert the response
alert("The response from the content script: " + response.response);//You have to choose which part of the response you want to display ie. response.response
});
});
}
每次脚本收到消息时,您都必须使用“sendResponse”函数发送回复。
希望这会有所帮助。
答案 1 :(得分:9)
同样的问题Chrome Extension Message passing: response not sent会有所帮助。
您只需要在侦听器上添加t
。
答案 2 :(得分:0)
我一直在寻找从弹出窗口中的内容脚本中获取数据的解决方案。是的,您可以将其与存储一起使用,但这适用于所有选项卡,因此最好将消息发送到活动选项卡,并读取响应:
内部popup.js
chrome.tabs.query({
active: true,
lastFocusedWindow: true
}, function (tabs) {
chrome.tabs.sendMessage(tabs[0].id, {data: 1}, function (response) {
console.log(response.data)
});
});
内部content.js
chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) {
if (message.data === 1) {
// accepts only 1 field
sendResponse({
data: 2
});
// very important to return true
return true;
}
});