Отправка сообщения из фонового скрипта в скрипт контента, а затем во внедрённый скрипт
Проблема:
Несмотря на попытку отправить сообщения с фоновой страницы в сценарий содержимого, а затем во внедренный сценарий, процесс не сработал должным образом. Сценарий содержимого не может получать сообщения из фонового сценария.
Решение:
Проблема возникает из-за способа внедрения сценариев содержимого. Когда расширение загружается, оно не внедряет сценарии содержимого автоматически в существующие вкладки. Внедрение происходит только при создании новой вкладки или переходе к существующей вкладке после загрузки расширения.
Решение 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
});
}
});
После реализации любого из этих решений сообщения могут быть успешно ретранслированы из фонового сценария в сценарий содержимого и, в конечном итоге, во внедренный сценарий.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3