Сообщение о расширении 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-сериализуемый.

Другие вопросы по тегам