2013-10-09 104 views
2

我正在使用crossrider.com编写便携式浏览器扩展。Crossrider浏览器扩展:前端和背景之间的双向通信

我的扩展由一个前端部分(crossrider:扩展页面范围)和一个后端部分(crossrider:background scope)组成。每个浏览器都会运行一次背景,即每个网站调用的前端。

我的后端提供了由前端调用的函数。 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不幸地不会将答案发送给调用后台函数的选项卡,而是发送给当前打开的选项卡 - 这可能在此期间发生了变化。

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

回答

3

可以解决该问题如下(这是一个有点像以太网协议):

  1. 前端:包括标签的ID将消息发送到后端
  2. 后端:广播的响应所有标签并在邮件中包含收到的标签ID
  3. 前端:只有具有匹配标签ID的标签处理响应

因此,使用您的代码为基础,该解决方案将是如下:

后端

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员工。

+0

在后端部分你的意思是.toAllTabs而不是.toActiveTab? – Heinzi

+0

是的......我错了这个错误,我纠正了这个例子 – Shlomo

相关问题