在Chrome扩展中传递消息的问题

时间:2011-06-03 18:44:44

标签: javascript google-chrome google-chrome-extension

我正在尝试开发Chrome扩展程序,并尝试在内容脚本和background.html页面之间进行通信。我在background.html中存储了一些值(本地存储),并在内容脚本中随时获取它。我的监听器监听我从contentcript发送的请求并获取数据并将其发送回contentcript。但是当我在contentcript中收到它时,我的数据变得“未定义”。

这是我的代码:

background.html:

chrome.extension.onRequest.addListener( 
  function(request,sender,sendresponse){
    if(request.Meta == '_service'){
    /*  return _getServiceOfAddon("_service");
    }
    else if(request.Meta == 'setAddOnService'){
        _setServiceAddon("_service",request.messageContent);        
    }*/
        if(request.messageContent){
            console.log('message content for setservice : '+request.messageContent);
            _setServiceOfAddon("_service",request.messageContent);      
        }
        else{
            //return _getServiceOfAddon("_service");
            console.log('message content for getservice : '+request.messageContent);
            var temp = _getServiceOfAddon("_service");
            console.log('getting service as '+ temp);
            sendresponse({ mydata : temp });
        }
    }
  });

内容脚本:

  Tagg.sideBar.backgroundInteraction.prototype.sendMessageToBackground = function(meta,messagecontent){
    if(!meta){
        chrome.extension.sendRequest(
            {
                Meta:'testingMessageConfirmation',
                messageContent:'This is a testing message sent from content script to background'
            },
            function(response){}
        );
    }
    else{
        chrome.extension.sendRequest(
            {
                Meta:meta,
                messageContent:messagecontent
            },
            function(response){
                //if(!response.data){
                    console.log('response data received as : '+ response.mydata);   
                    return response;
                // }
            }
        );
    }
}

我在内容稿中收到的response.data是“未定义的”。任何人都可以指出我在这里犯的错误吗?这似乎很简单,但我找不到我犯错的确切位置。

1 个答案:

答案 0 :(得分:0)

首先,_getServiceOfAddon()返回的确切类型的对象是什么?我确信其目的是返回一个字符串,但是如果传递消息,则undefined错误的一个可能原因是尝试传递类,函数等内容。您可能想尝试console.log on response对象。

使用return的可能性越大,这对于消息传递等异步内容不起作用。您应该以其他方式将返回值分配给其目标,例如使用this或将引用传递给DOM对象或将其分配给类似settings["_service"]的哈希。

换句话说,Tagg.sideBar.backgroundInteraction.sendMessageToBackground()将始终返回undefined。您在chrome.extension.sendRequest()中的回调函数会将response返回到chrome.extension.sendRequest不会 sendMessageToBackground()。请记住,函数会向其调用者返回一个值,在这种情况下,其调用者为sendRequest()