2013-09-09 3 views
6

Каков правильный способ отправки сообщения (и получения ответа) на background.js из popup.js в расширении Chrome? Каждый метод, который я пытаюсь, заканчивается ошибкой, которая:Отправка сообщения из popup.js в расширение Chrome на background.js

«Порт: Не удалось установить соединение. Точка приема не существует».

Я бы предпочел использовать chrome.extension.sendMessage() над chrome.extension.connect() с port.postMessage(), но ни один из методов, похоже, не сработал.

То, что я пытаюсь сделать, это подключить кнопку в popup.html для вызова в javascript в popup.js, который обращается к background.js, чтобы получить информацию о currentTab(), которая была topMost (то есть: чтобы получить текущую строку URL, чтобы показать в popup.html)

Сейчас в popup.js (подключен к действию кнопки) Я:

function getURL() 
{ 
    chrome.extension.sendMessage({greeting: "GetURL"}, 
      function(response) { tabURL = response.navURL }); 

    $("#tabURL").text(tabURL); 
} 

в фоне .js У меня есть:

chrome.extension.onMessage.addListener(function(request,sender,sendResponse) 
{ 
    if(request.greeting == "GetURL") 
    { 
     var tabURL = "Not set yet"; 
     chrome.tabs.getCurrent(function(tab){ 
      tabURL = tab.url; 
     }); 

     sendResponse({navURL:tabURL}); 
    } 
} 

Любые идеи?

+0

увидеть этот ответ на https://stackoverflow.com/questions/13546778/how-to-communicate-between-popup-js-and-background-js-in-chrome-extension/47545616#47545616 – JerryGoyal

ответ

17

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

В любом случае, у вас есть довольно много ошибок в коде.

Первый ваш полностью игнорировать тот факт, что все обратные вызовы в хромированной апи являются асинхронным.

На фоне страницы

var tabURL = "Not set yet"; 
    chrome.tabs.getCurrent(function(tab){ 
     tabURL = tab.url; 
    }); //this will be invoked somewhere in the future 

    sendResponse({navURL:tabURL}); 
    //navUrl will be always Not set yet because callback of getCurrent hasn't been called yet 

То же самое в popup.js

chrome.runtime.sendMessage({greeting: "GetURL"}, 
      function(response) { tabURL = response.navURL });//callback will be invoked somewhere in the future 

$("#tabURL").text(tabURL)//tabURL will display something totally different from what you have been expected 

Второй ошибка в том, что chrome.tabs.getCurrent не дает вам текущую вкладку, выбранный пользователем в главном окне. docs говорит:

Получает вкладку, из которой выполняется этот вызов скрипта. Может быть undefined, если вызывается из контекста без табуляции (например: фоновая страница или всплывающее окно).

Таким образом, вы получите undefined для всех ваших запросов, потому что вы вызываете его на странице фона. Что нужно сделать, так это использовать метод chrome.tabs.query для получения активных вкладок.

Таким образом, после фиксации всех проблем, новый код должен выглядеть следующим образом:

background.js

chrome.runtime.onMessage.addListener(function(request,sender,sendResponse) 
{ 
    if(request.greeting === "GetURL") 
    { 
     var tabURL = "Not set yet"; 
     chrome.tabs.query({active:true},function(tabs){ 
      if(tabs.length === 0) { 
       sendResponse({}); 
       return; 
      } 
      tabURL = tabs[0].url; 
      sendResponse({navURL:tabURL}); 
     });   
    } 
} 

всплывающее окно.JS

function getURL() { 
    chrome.runtime.sendMessage({greeting: "GetURL"}, 
     function (response) { 
      tabURL = response.navURL; 
      $("#tabURL").text(tabURL); 
     }); 
} 
+8

Просто отметим, похоже, что API расширения Chrome устарел на chrome.extension.sendMessage и заменил его на chrome.runtime.sendMessage: https://developer.chrome.com/extensions/messaging –

+0

И как это работает вице- Versa? От background.js до popup.js? Благодарю. € dit: хорошо, понял, это в основном то же самое, что и в другом месте. – chitzui

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