2013-06-19 1 views
3

Я экспериментировал с расширением хром. Моя цель - отправить сообщение из фонового сценария на инъецированный скрипт и вернуть вложенный сценарий обратно результат.Расширение Chrome: ошибка при отправке сообщения обратно из вложенного скрипта в фоновый скрипт

код, как показано ниже:

background.js

chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab){ 
    chrome.tabs.executeScript(tabId, {'file': "content.js"}, 
     function(){ 
      chrome.tabs.sendMessage(tabId, {msg: 'test'}, 
       function(response){ 
        console.log(response); 
       } 
      ); 
      return true; 
     } 
    ); 
}); 

content.js

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
     sendResponse('test message'); 
     return true; 
    } 
); 

Я получаю сообщение об ошибке

Could not send response: The chrome.runtime.onMessage listener must return true if you want to send a response after the listener returns 

при вызове sendResponse инов ide content.js

Я уже возвращаю истину от слушателя. confused?
Я пропустил что-то очевидное?

+0

что не кажется, проблема. Я могу удалить эту строку без какого-либо эффекта. Ошибка в content.js. –

+0

Вы пытались удалить 'return true' в своем слушателе' onMessage'? – BeardFist

+0

Не знаете, почему вы получаете эту ошибку, но это может иметь какое-то отношение к тому факту, что вы генерируете слушателей «на лету» с помощью OnUpdate. Возможно, вы захотите попробовать другой подход: добавьте скрипт содержимого в файл манифеста для загрузки всех URL-адресов при запуске документа. Затем сценарий содержимого отправит сообщение на исходную страницу при загрузке. Тогда сценарий фона и содержимого может нормально взаимодействовать. –

ответ

0

Я думаю, что моя проблема была решена с помощью

chrome.tabs.sendMessage(tabId, {action: 'test'}, 

Примечание, я неправильно использовать msg вместо action в поставленный выше вопрос.

Кроме того, я не использую третий параметр sendResponse, чтобы избежать полнодуплексной связи. Я просто отправляю другое сообщение из сценария контента обратно на страницу фона.

Из скрипта содержимого, отправить сообщение фона страницы с помощью:

function SendMessageToBackgroundPage(data) 
{ 
    chrome.runtime.sendMessage({ 
     action: 'kungfu', 
     source: 'panda' 
    }); 
} 

Поймайте его в фоновом режиме страницы с помощью:

chrome.runtime.onMessage.addListener(
     function(request, sender, sendResponse) { 
      switch (request.action) { 
       case 'kungfu': alert(request.source); 
      } 
     }); 
+1

Я считаю, что вы должны использовать ** chrome.runtime.sendMessage/onMessage ** вместо ** chrome.extension.sendMessage/onMessage **. Особенно, когда используются страницы событий (а не фоновые страницы), потому что функции ** chrome.runtime ** обеспечивают правильную загрузку приостановленной исходной страницы перед ответом/выполнением каких-либо действий. – gkalpak

+0

@ExpertSystem Похоже, Google удалил ссылку на extension.sendMessage из [последних документов] (http://developer.chrome.com/extensions/extension.html). Обновлен мой ответ. –

Смежные вопросы