Crossrider Browser Extension:前端和后台之间的双向通信

时间:2013-10-09 13:23:31

标签: javascript message javascript-framework crossrider

我正在使用crossrider.com编写便携式浏览器扩展程序。

我的扩展包括前端部分(交叉器:扩展页面范围)和后端部分(交叉器:后台范围)。每个浏览器运行一次后台,每个站点呼叫的前端。

我的后端提供由前端调用的函数。 Crossrider为此提供了一个消息传递API。

前端现在想要请求一些数据,后端应该返回它。我选择的方式是:

后端:

appAPI.message.addListener({channel:"functionname"},function(returnval) {
    //Calculate some value v
    appAPI.message.toActiveTab(v, {channel:"functionname_returnval"});
});

前端:

appAPI.message.addListener({channel:"functionname_returnval"}, function(message) {
    //Do something with the return value
});
appAPI.message.toBackground(message,{channel:"functionname"});

这是有效的,但仅限于用户在此期间不切换标签的情况。 appAPI.message.toActiveTab不幸地不会将响应发送到调用后台函数的选项卡,而是发送到当前打开的选项卡 - 这可能在此期间发生了变化。

如何将响应发送到调用后台功能的选项卡?

1 个答案:

答案 0 :(得分:3)

您可以按如下方式解决问题(它有点像以太网协议):

  1. 前端:将标签的ID包含在发送到后端的邮件中
  2. 后端:广播对所有标签的回复,并在邮件中包含收到的标签ID
  3. 前端:只有匹配标签ID的标签会处理回复
  4. 因此,使用您的代码作为基础,解决方案如下:

    <强>后端

    appAPI.message.addListener({channel:"functionname"}, function(returnval) {
        //Calculate some value v
        appAPI.message.toAllTabs({tabId:returnval.tabId,rv:v}, {channel:"functionname_returnval"});
    });
    

    <强>前端

    appAPI.message.addListener({channel:"functionname_returnval"}, function(message) {
        // Check if message is for this tab
        if (message.tabId === appAPI.getTabId()) {
            //Do something with the return value (message.rv)
        }
    });
    appAPI.message.toBackground({tabId:appAPI.getTabId(), ...},{channel:"functionname"});
    

    免责声明:我是Crossrider的员工。