background.html和popup.html之间未传递消息

时间:2012-01-02 19:47:22

标签: google-chrome-extension

我正在尝试将sessionStorage中保存的数据从background.html传递到popup.html

background.html:

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  data = sessionStorage.getItem(request.tabId);
  alert(data);
  sendResponse({ data: data });
});

并在popup.html中:

chrome.tabs.getSelected(null, function(tab) {
  chrome.extension.sendRequest({ tabId: tab.id }, function(response) { 
    alert(response.data);
  });
});

弹出窗口是通过pageAction按钮打开的,当我点击按钮时,我会在弹出窗口中看到一个带有“null”的警告框,然后是一个警告框,其中包含我在sessionStorage中存储在背景中的数据!

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您不需要使用消息/请求API。我认为this response可能会对您有所帮助。

您也不需要sessionStorage,只需将数据存储在后台页面的全局变量中。它将持续存在,直到浏览器关闭或重新启动扩展程序。

所以,以下是我重写代码的方法:

background.html:

var data = {}; // Object storing data indexed by tab id

并在popup.html中:

chrome.tabs.getSelected(null, function(tab) {
  alert(chrome.extension.getBackgroundPage().data[tab.id]);
});

请注意chrome.tabs.getSelected已弃用since Chrome 16,因此弹出式代码应为:

chrome.windows.getCurrent(function(win) { 
  chrome.tabs.query({'windowId': win.id, 'active': true}, function(tabArray) {
    alert(chrome.extension.getBackgroundPage().data[tabArray[0].id]);
  }); 
});

答案 1 :(得分:0)

好吧,我做了些蠢事。

我通过在标签中打开chrome-extension://[extension-id]/background.html而不是点击扩展程序管理页面中的“检查活动视图:background.html”来检查后台页面。这导致选项卡捕获请求并调用sendResponse,但弹出窗口期望REAL背景页面调用sendResponse(如果我理解Google有关消息传递的文档,则sendResponse被调用两次的事实是问题的根源,因为第一次调用会清除request对象)