Вопрос по javascript – Как я могу общаться между background.js и popup.js?

4

У меня есть расширение с фоновым скриптом:

<code>"background": {
    "scripts": ["scripts/background.js"]
  },
</code>

и скрипт контента:

<code>"content_scripts": [
    {
      "matches": ["*://*/*"],
      "js": ["scripts/content_script.js"]
    }
  ],
</code>

всплывающее окно(popup.html) и всплывающий скрипт(popup.js). popup.js не регистрируется в манифесте и имеет дело с просмотром popup.html и прослушиванием действий пользователя, выполненных в popup.html, таких как нажатие кнопки.

Я хочу сделать расширение, что отправляет по электронной почте страницу текущей вкладки, и для этого мне нужно получить страницу DOM сcontent_script, передать данные (DOM) вbackground script. После этого, когда пользователь запускает событие в popup.html, popup.js перехватывает это событие, и я хочу, чтобы popup.js мог получать переданные данные (DOM) из background.js. Как я мог сделать это? Итак, мой вопрос, как я могу общаться между background.js и popup.js?

Я нашел ответ на свой вопрос:

Спасибо Элвису, думаю, я решил проблему; Мне нужно только получить DOM сайта в скрипте контента, но решение моего вопроса было следующим:

Content_script.js

<code> // SEND DOM structure to the background page
    chrome.extension.sendRequest({dom: "page DOM here"});
</code>

Background.html

<code><html>
<head>
<script>
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    if(request.dom != "")
        var theDOM = request.dom;
        console.log(request.dom); // page DOM here -> works
        chrome.extension.sendRequest({theDOM: theDOM}); // theDOM : "page DOM here"
});
</script>
</head>
<body>
</body>
</html>
</code>

Popup.js

<code>var dom;
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    if(request.theDOM != ""){
        console.log("popup request: "+request.theDOM);
        dom = request.theDOM;
    }
});

// HANDLE TAB_1 REQUESTS (EMAIL PAGE)
// ---------------------------------
$("#send").click(function(){
    console.log(dom); // page DOM here
}
</code>

Спасибо за помощь ;

Ваш Ответ

1   ответ
4

документаци:

Используйте это в своем скрипте контента:

chrome.extension.sendRequest({greeting: "hello"}, function(response) {
  console.log(response.farewell);
});

Это отправляет{greeting: "hello"} на заднем плане. Обратите внимание на обратный вызов, указанный

Фоновая страница может прослушивать эти запросы, используя:

chrome.extension.onRequest.addListener(
  function(request, sender, sendResponse) {
    if (request.greeting == "hello")
      sendResponse({farewell: "goodbye"});
  });

Аргументы в пользуsendResponse функция будет передана в обратный вызов

Спасибо, я уже прочитал эту статью в документации и уже вставил в свой код, но две проблемы все еще существуют - это только обмен сообщениями междуcontentscript а такжеbackgroundscript, а не междуbackgoundscript а такжеpopup.js. Обратите внимание: у меня есть 3 скрипта, 1 контент, 1 фон и 1 для редактирования popup.htmls. - другая проблема в том, что в консоли я не вижу оповещения / текста, поэтому разбор сообщений не работает у меня. -> мне нужно вызвать событие, чтобы отправить запрос? Jim-Y
Когда событие вызывается во всплывающем окне, вы можете общаться с фоном так же, как указано в ответе (т. Е. Используя chrome.extension.sendRequest), и фон может возвращать нужные данные. Elvis D'Souza
Ооо, как только я изменил background.js на background.html, разбор сообщений начал работать, одна проблема решена :) Элвис: хорошо, я попробую, спасибо Jim-Y
Большой. Вы должны написать ответ (который объясняет ваше решение) и принять его как правильный ответ Elvis D'Souza
Проблемы снова, после выполнения показанных вопросов, я хочу обработать данные, подобные этим, в popup.js:console.log(dom); //page DOM here || alert(dom); //page DOM here || var body = dom; alert(body); //undefined Я просто не могу понять, в чем может быть проблема: Jim-Y

Похожие вопросы