Сообщение о расширении chrome не передано без ответа: undefined
Я пытаюсь передать сообщение в расширении Chrome. Я следую этому примеру ( см. Здесь) -:
content_script:
chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
console.log(response.farewell);
});
фон:
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) {
console.log(response.farewell);
});
});
popup.js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.greeting == "hello")
console.log("message recive")
sendResponse({farewell: "goodbye"});
});
Хотя я сделал copy-paste - сообщение не отправлено. Ошибка выскакивает:
Ошибка в обработчике события для (неизвестно): TypeError: Невозможно прочитать свойство 'прощай' из неопределенного
Где ошибка?
1 ответ
Всплывающее окно не существует, пока оно закрыто.
Таким образом, в момент отправки сообщения, вероятно, никто не слушает, поэтому обратный вызов вызывается с undefined
в качестве ответа (и с chrome.runtime.lastError
задавать).
С точки зрения архитектуры, фоновая страница всегда доступна для обработки сообщения; в качестве таких, onMessage
слушатели в большинстве (не во всех) случаях чувствуют себя лучше.
Я бы порекомендовал также взглянуть на этот вопрос, где я объясню некоторые концепции более подробно: передайте переменную из скрипта контента во всплывающее окно.
Кроме того, на всякий случай, весь этот пример кода приветствия-прощания является лишь примером; Вы можете передать что-нибудь JSON-сериализуемый.