Расширение Chrome: отправка сообщения с background.js на content.js всякий раз, когда изменяется URL текущей вкладки

#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 @wOxxOm

3. Предполагая, что вы хотите запустить анализатор на html, вы можете изменить поток: пусть скрипт содержимого отправляет данные, например, chrome.runtime.SendMessage(document.documentElement.innerHTML), которые будут получены в chrome.runtime.onMessage фонового скрипта, который вызовет ваш код python.