Повторный запуск фонового скрипта для каждой страницы, на которую осуществляется переход

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

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

Вопрос:

Я написал расширение для Google Chrome под названием «Word Welter«, которое демонстрирует типогликемию.

Это расширение использует фоновый скрипт для включения и выключения скремблирования слов. Однако, хотя это работает на веб-странице, если пользователь включает функциональность, а затем переходит на другую страницу (т. Е. Нажимает на гиперссылку на текущей странице), кнопка Chrome возвращается в исходное состояние (хотя текст всплывающей подсказки кнопки говорит, что функциональность все еще включена!) и функция скремблирования отключена. Похоже, что мой сценарий содержимого выполняется только один раз (т. Е. При выполнении переключения).

Я хочу, чтобы функция скремблирования оставалась активной, когда пользователь переходит на другие страницы, и я надеялся, что мое использование фонового скрипта будет работать, но это явно не так. Кто-нибудь знает, как я могу исправить эту проблему?

Обратите внимание, что функция скремблирования работала нормально (т. Е. Для каждой страницы, На которую пользователь переходил), прежде чем я ввел кнопку переключения. Однако кнопка переключения необходима, так как это раздражает, если каждая страница постоянно скремблируется!

Фоновый скрипт (background.js ) заключается в следующем:

 var toggle = false;
chrome.browserAction.onClicked.addListener(function(tab) {
  toggle = !toggle;
  if(toggle){
    chrome.browserAction.setIcon({path: "WordWelterIcon19x19_On.png", tabId:tab.id});
    chrome.browserAction.setTitle({title: "Word Welter On"});
    chrome.tabs.executeScript(tab.id, {file:"content_script.js"});
  }
  else{
    chrome.browserAction.setIcon({path: "WordWelterIcon19x19_Off.png", tabId:tab.id});
    chrome.browserAction.setTitle({title: "Word Welter Off"});
    chrome.tabs.executeScript(tab.id, {code:"window.location.reload();"});
  }
});
  

и мой manifest.json содержит следующую запись для фонового скрипта:

 "background": {
   "scripts": ["background.js"] 
  }
  

Любая помощь приветствуется.

Ответ №1:

Я сам нашел решение этого вопроса. Я изменил код на:

 var toggle = false;

var executeContentScript = function() {
    chrome.tabs.executeScript({file:"content_script.js", allFrames : true });
};

chrome.browserAction.onClicked.addListener(function(tab) {
  toggle = !toggle;
  if(toggle){
    chrome.browserAction.setIcon({path: "WordWelterIcon19x19_On.png"});
    chrome.browserAction.setTitle({title: "Word Welter On"});
    executeContentScript();
    chrome.tabs.onUpdated.addListener(executeContentScript);
  }
  else{
    chrome.tabs.onUpdated.removeListener(executeContentScript);
    chrome.browserAction.setIcon({path: "WordWelterIcon19x19_Off.png"});
    chrome.browserAction.setTitle({title: "Word Welter Off"});
    chrome.tabs.executeScript({code:"window.location.reload();"});
  }
});
  

Исправление заключалось в добавлении прослушивателя, чтобы сценарий содержимого выполнялся каждый раз при обновлении активной вкладки; см. Вызов:

 chrome.tabs.onUpdated.addListener(executeContentScript);
  

Этот прослушиватель не регистрируется, когда он снова переключается путем вызова «removeListener» :

 chrome.tabs.onUpdated.removeListener(executeContentScript);