Сообщение не передается между background.html и popup.html - PullRequest
0 голосов
/ 02 января 2012

Я пытаюсь передать данные, сохраненные в 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, когда я нажимаю кнопку, я получаю окно предупреждения с «нулем» во всплывающем окне, а затем окно предупреждения с данными, которые я сохранил в sessionStorage на фоне!

Есть идеи как это исправить?

Ответы [ 2 ]

3 голосов
/ 03 января 2012

Вам не нужно использовать API сообщений / запросов. Я думаю этот ответ может вам помочь.

Вам также не нужен 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 устарела начиная с 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]);
  }); 
});
0 голосов
/ 03 января 2012

Ну, я сделал что-то глупое.

Я проверил фоновую страницу, открыв chrome-extension://[extension-id]/background.html на вкладке вместо того, чтобы нажимать «проверять активные представления: background.html» на странице управления расширениями. Это заставило вкладку перехватить запрос и вызвать sendResponse, но всплывающее окно ожидало, что РЕАЛЬНАЯ фоновая страница вызовет sendResponse (и, если я понимаю документацию Google относительно передачи сообщений, тот факт, что sendResponse вызывался дважды, является корнем проблемы потому что первый вызов очищает объект request)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...