chrome扩展发送响应不起作用

时间:2013-12-06 23:38:56

标签: javascript google-chrome

我正在编写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格式的数据。但是,警报(响应)不显示任何消息。任何人都可以给我一些想法,为什么它不起作用?

提前谢谢!

3 个答案:

答案 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; 
    }
});