我正在尝试将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中存储在背景中的数据!
任何想法如何解决这个问题?
答案 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
对象)