为导航到的每个页面重新运行后台脚本

时间:2014-06-25 23:58:37

标签: javascript google-chrome google-chrome-extension listener background-process

我写了一个名为“Word Welter”的Google Chrome扩展程序,它可以显示典型血糖。

此扩展程序使用后台脚本来切换单词加扰和关闭。然而,虽然这适用于网页,但如果用户打开功能然后浏览到其他页面(即点击当前页面中的超链接),则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 个答案:

答案 0 :(得分:0)

我自己找到了这个问题的解决方案。我将代码更改为:

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