#javascript #google-chrome-extension #listener
#javascript #google-chrome-extension #прослушиватель
Вопрос:
Я пытаюсь отправлять сообщение с background.js
на content.js
каждый раз, когда изменяется URL текущей вкладки (либо через перезагрузку, либо без перезагрузки).
В background.js Я добавляю прослушиватель обновлений вкладок, фильтрую текущее активное окно и отправляю сообщение:
/*global chrome*/
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if (changeInfo.url) {
chrome.tabs.query({active: true, currentWindow: true},function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {message: "hi"}, function(response) {
console.log(response);
});
});
}
});
В content.js , я добавляю прослушиватель onMessage для проверки этого сообщения:
/*global chrome*/
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
console.log("runtime", request);
if (request.message === 'hi') {
console.log('I am from content script: ', request.message);
sendResponse("goodbye");
}
})
Однако, похоже, это не работает. Когда я удаляю chrome.tabs.onUpdated.addListener
и имею только:
chrome.tabs.query({active: true, currentWindow: true},function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {message: "hi"}, function(response) {
console.log(response);
});
});
тогда это работает по любой причине. Итак, я считаю, что ошибка заключается в использовании обновленного прослушивателя.
Заранее спасибо!
Комментарии:
1. При изменении URL вкладка начинает загружать новую страницу, затем запускается ваше SendMessage, затем страница загружается, и скрипт содержимого запускается в DOMContentLoaded (по умолчанию), поэтому он не получит сообщение. Неясно, чего вы хотите достичь с помощью этого кода, потому что сценарий содержимого уже знает новый URL как
location.href
.2. Вот мое фактическое намерение: я хотел бы получить URL в фоновом режиме. js при каждом изменении URL-адреса вызывайте функцию Python (анализатор текста) для этого URL-адреса и, наконец, отправляйте результирующую строку в виде сообщения, скажем, компоненту React
App.js
. Я знаю, что это немного связано с вопросом, но я предположил, что если я смогу сделать это дляcontent.js
, я должен быть в состоянии сделать это дляApp.js
@wOxxOm3. Предполагая, что вы хотите запустить анализатор на html, вы можете изменить поток: пусть скрипт содержимого отправляет данные, например, chrome.runtime.SendMessage(document.documentElement.innerHTML), которые будут получены в chrome.runtime.onMessage фонового скрипта, который вызовет ваш код python.