как общаться между страницей настроек и фоновой страницей расширения Chrome - PullRequest
6 голосов
/ 09 января 2012

Я столкнулся с проблемой.Через передачу сообщений я перенес данные DOM из скрипта контента на фоновую страницу.Я хотел бы знать, как вы можете установить канал связи между страницей параметров и фоновой страницей.API chrome.extension.getBackgroundPage() не полезен.Также не работают традиционные сообщения, проходящие через sendRequest и addlistener.Как перенести эти данные с фоновой страницы на страницу настроек?Может ли кто-нибудь предоставить проверенный фрагмент для объяснения?


Это то, что я пытался.В моем contentscript.js

    <script>
    var selected_Text ="";
    window.addEventListener("dblclick",function(event){

    selected_Text = String(window.getSelection());
    chrome.extension.sendRequest({greeting: "maprender",name:selected_Text},     function(response) {
        alert("reached here")
        console.log(response.farewell);
        });

//i am to then load options.html on DOM like this 
var Div = document.createElement("iframe");
Div.setAttribute('src', chrome.extension.getURL('options.html'));
Div.setAttribute("style","width:130px;height:80px;position:absolute;left:10px;");
Div.setAttribute("id","xyz");
document.body.appendChild(Div);
</script>

я получаю selected_Text в background.html, как это

<script>
var Addr_details={
place:null
};
chrome.extension.onRequest.addListener(
  function(request, sender, sendResponse) {

    if (request.greeting == "maprender")
     {
        alert("reached here sendin resp"+request.name);
        Addr_details.place = request.name;
        sendResponse({farewell: "goodbye"});

     }
    else
      sendResponse({}); // snub them.
  });
</script>

Теперь, чтобы получить доступ к значению этого текста на странице параметров options.html, я попробовал2 метода Один из них - использовать chrome.extension.getBackgroundPage () следующим образом:

<script>
function init(){
var bkg = chrome.extension.getBackgroundPage();
alert("the selected text is "+bkg.Addr_details.place);
}
</script>

init - это загрузка options.html. Это не дает мне значения.На самом деле, он просто завершается при инициализации chrome.extension.backgroundPage.

Еще один подход, который я пробовал, заключался в создании аналогичного запроса (подобного тому, который уже присутствует в contentscript.js) из contentscript.js с другим приветствием и добавлениемслушатель его в файле options.html. Похоже, что он не работает ни на стороне получателя (страница параметров), потому что после запроса я получаю обратный вызов в contentScript. Я действительно что-то делаю не так, не так ли? Пожалуйста, помогите.

1 Ответ

4 голосов
/ 09 января 2012

Имеет смысл, чтобы второй подход не работал.Options.html не "жив" все время, только когда страница настроек открыта.Следовательно, он не может прослушивать запросы от скрипта контента.Это именно то, для чего используется "background".

Что касается первого подхода (с использованием getBackgroundPage ()), я никогда не использовал этот метод сам, но, похоже, он возвращает только DOM фоновой страницы, и поэтомуВы не можете получить доступ к переменным в фоновом режиме. js.

Лучше всего отправить запрос со страницы параметров на фоновую страницу, запрашивая это значение, например:

Сценарий содержимого:

chrome.extension.sendRequest({greeting: "retrieveAddr"}, function(response) {
  // do something with response.addr...
});

Фоновая страница:

chrome.extension.onRequest.addListener(
  function(request, sender, sendResponse) {
    switch (request.greeting) {
    case "maprender"):
      alert("reached here sendin resp"+request.name);
      Addr_details.place = request.name;
      sendResponse({farewell: "goodbye"});
      break;
    case "retrieveAddr":
      sendResponse({addr: Addr_details});   

    default:
      sendResponse({}); // snub them.
  });
});

Другое, более простое, но хакерское решение - использовать localStorage для передачи информации между опциями и фоновыми страницами, так как они обаподелитесь тем же самым.

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