Установить канал связи между скриптом содержимого и фоновой страницей

#javascript #google-chrome #google-chrome-extension #background-process

#javascript #google-chrome #google-chrome-расширение #фоновый процесс

Вопрос:

Разработка расширения Chrome с использованием javascript — один из моих университетских проектов.

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

background.html

 chrome.tabs.getSelected(null, function(tab) { 
    chrome.tabs.sendRequest(tab.id, {method: "getHTML"}, function(response) { 
        console.log(response.data); 
    }); 
}); 
  

content_script.js

 chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
    if (request.method == "getHTML") 
        sendResponse({data: document.getElementById('header').innerHTML}); 
    else sendResponse({}); 
});
  

Ответ №1:

Несколько основных проблем:

  1. Вы зависите от некоторого элемента на странице, имеющего идентификатор header . Такие идентификаторы предоставляются на усмотрение дизайнера сайта, поэтому на самом деле они есть у очень немногих страниц (включая Google). Возможно, выберите что-то более универсальное, например заголовок страницы ( document.title ).
  2. Что означает «кнопка расширения»? Если это означает действие браузера, это часть вашего расширения, так что вы правы, когда хотели отправить что-то из фонового скрипта. Это также более простой случай, поскольку вполне вероятно, что (помимо проблемы, описанной выше, из-за отсутствия страниц Google, имеющих элемент ID header ), вы просто не фиксируете событие нажатия действия браузера. Однако, если это какая-то введенная кнопка, все наоборот.

То, что вы хотите (версия для браузера)

фон.html (встроенный):

 chrome.browserAction.onClicked.addListener(function(tab) {
  chrome.tabs.getSelected(null, function(tab) {
    chrome.tabs.sendRequest(tab.id, { method: "getHTML"}, function(response) {
      console.log(response.data);
    });
  });
});
  

content_script.js

 chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  if (request.method === "getHTML") {
    sendResponse({data: document.title});
  } else {
    sendResponse({});
  }
});
  

Что вы могли бы пожелать (версия с введенным нажатием кнопки)

background.html:

 chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  if (request.method === "getHTML") {
    console.log(request.data);
  }
});
  

content_script.js:

 function buttonClick() {
  chrome.extension.sendRequest({method: "getHTML", data: document.title});
}
  

Код для ответа на комментарий ниже

Очень важная рекомендация: Справочник разработчика Chrome, вероятно, один из самых дружественных в мире. Если вы хотите узнать, какие части chrome.* API доступны, начните с этого.

 function getHtml(tabId) {
  chrome.tabs.sendRequest(tabId, { method: "getHTML"}, function(response) {
    console.log(response.data);
  });
}

// Note that this will only work once a tab has loaded
chrome.tabs.onSelectionChanged.addListener(function(tabId) {
  getHtml(tabId);
});

// This fires the first time a page is loaded
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo) {
  if (changeInfo.status === "complete") {
    getHtml(tabId);
  }
});
  

Код для второго ответа на комментарий ниже

background.html

 chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  if (request.method === "getHTML") {
    console.log(request.data);
  }
});
  

content_script.js

 document.addEventListener("keypress", function(e) {
  chrome.extension.sendRequest({method: "getHTML", data: e.which});
});
  

Комментарии:

1. Большое спасибо за исправленный код и форматированную версию тоже. Я новичок в этом и не изучил все форматирование. Я действительно сожалею о удобочитаемости кода. Однако, возвращаясь к вашему коду, я протестировал код, и он работает удивительно хорошо, но он работает, только если я обновляю страницу на каждой вкладке. Возможно ли заставить это работать, если я просто нажимаю на вкладку и отображается заголовок вместо перезагрузки страницы?

2. Я бы предпочел последнюю версию. Большое спасибо за это. Итак, если я хочу что-то еще с вкладки; например, если я хочу нажатия клавиш или что-то подобное с каждой вкладки, как это будет выглядеть (должен ли я создавать прослушиватель onkeypress)? Я знаю, что это очень прямой вопрос, но я действительно хочу узнать, как работает этот обмен сообщениями с различными опциями.

3. Я ответил на ваш первый комментарий некоторым кодом. Вы бы просто заменили фон. html-часть версии браузера action. Что касается части нажатия клавиш, да, вы могли бы сделать что-то подобное document.addEventListener("keypress", function(e) { chrome.extension.sendRequest(...) }); в скрипте содержимого (введенная версия кнопки). Не забывайте думать о том, кто говорит и кто слушает: скрипт содержимого должен быть говорящим / запрашивающим, если это взаимодействие с самой страницей, и фоновым скриптом, если это какой-то закулисный процесс в вашем расширении.

4. я сделал это, но теперь, похоже, возникла какая-то проблема, поскольку снова ничего не отображается? Должен ли я отправить вам код по электронной почте, потому что, если я опубликую его здесь, он снова может стать беспорядочным?

5. Нет, просто посмотрите мой ответ выше. Зафиксировать нажатие клавиши довольно просто.