#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);