«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как установить связь между фоновым скриптом и внедренным скриптом через контентный скрипт?

Как установить связь между фоновым скриптом и внедренным скриптом через контентный скрипт?

Опубликовано 9 ноября 2024 г.
Просматривать:828

How to Establish Communication from Background Script to Injected Script through Content Script?

Отправка сообщения из фонового скрипта в скрипт контента, а затем во внедрённый скрипт

Проблема:
Несмотря на попытку отправить сообщения с фоновой страницы в сценарий содержимого, а затем во внедренный сценарий, процесс не сработал должным образом. Сценарий содержимого не может получать сообщения из фонового сценария.

Решение:
Проблема возникает из-за способа внедрения сценариев содержимого. Когда расширение загружается, оно не внедряет сценарии содержимого автоматически в существующие вкладки. Внедрение происходит только при создании новой вкладки или переходе к существующей вкладке после загрузки расширения.

Решение 1. Условное внедрение скрипта
Чтобы обеспечить связь между фоном и содержимым сценариев, можно использовать условную инъекцию сценария. Фоновый скрипт может проверить, готова ли вкладка получать сообщения, и внедрить скрипт содержимого, только если он еще не внедрен.

Код:

// Background script
function ensureSendMessage(tabId, message, callback) {
  chrome.tabs.sendMessage(tabId, { ping: true }, function (response) {
    if (response && response.pong) { // Content script ready
      chrome.tabs.sendMessage(tabId, message, callback);
    } else { // No listener on the other end
      chrome.tabs.executeScript(tabId, { file: "content_script.js" }, function () {
        if (chrome.runtime.lastError) {
          console.error(chrome.runtime.lastError);
          throw Error("Unable to inject script into tab "   tabId);
        }
        // OK, now it's injected and ready
        chrome.tabs.sendMessage(tabId, message, callback);
      });
    }
  });
}

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

chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
  if (request.ping) {
    sendResponse({ pong: true });
    return;
  }
  // Content script action
});

Решение 2. Предотвращение двойного выполнения
Другое решение включает в себя внедрение сценария содержимого на вкладку, но реализацию мер, предотвращающих его повторное выполнение.

Код:

// Background script
function ensureSendMessage(tabId, message, callback) {
  chrome.tabs.executeScript(tabId, { file: "content_script.js" }, function () {
    if (chrome.runtime.lastError) {
      console.error(chrome.runtime.lastError);
      throw Error("Unable to inject script into tab "   tabId);
    }
    // OK, now it's injected and ready
    chrome.tabs.sendMessage(tabId, message, callback);
  });
}

Скрипт содержимого:

var injected;

if (!injected) {
  injected = true;
  // Your toplevel code
}

Решение 3. Неизбирательное внедрение скрипта
Наконец, вы можете внедрить скрипт контента во все вкладки при инициализации расширения. Это целесообразно только в том случае, если ваш скрипт не мешает сам себе при многократном выполнении или после загрузки страницы.

Код:

chrome.tabs.query({}, function (tabs) {
  for (var i in tabs) {
    // Filter by URL if needed
    chrome.tabs.executeScript(tabs[i].id, { file: "content_script.js" }, function () {
      // Now you can use normal messaging
    });
  }
});

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

Заявление о выпуске Эта статья перепечатана по адресу: 1729218083. В случае каких-либо нарушений, пожалуйста, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3