Google chrome extension 侦听器多次实例化

Google chrome extension 侦听器多次实例化,google-chrome-extension,listener,Google Chrome Extension,Listener,我正在开发一个Chrome扩展,其中有一个弹出窗口,可以调用background.js的“begin”函数。Background.js打开选项卡,我在Background.js中有一个侦听器,它向选项卡的content_script.js发送消息: background.js function begin() { var mySendedTabs = new Array(); chrome.tabs.onUpdated.addListener(function(tabId, change

我正在开发一个Chrome扩展,其中有一个弹出窗口,可以调用background.js的“begin”函数。Background.js打开选项卡,我在Background.js中有一个侦听器,它向选项卡的content_script.js发送消息:

background.js

function begin() {
  var mySendedTabs = new Array();
  chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab)
  {             
   if(mySendedTabs.indexOf(tabId) == -1) {
    if(changeInfo.status == "complete")
    {
     chrome.tabs.sendMessage(tabId, { question: "What's your location ?" });
     mySendedTabs.push(tabId);                      
    }
   }                
 });
}
content_script.js回复另一条消息:

chrome.runtime.onMessage.addListener(
 function(request, sender, sendResponse) {
  if(request.question == "What's your location ?") {
   alert("Got a location request");
   chrome.runtime.sendMessage({myLocation : location.href});
  }
});
从“”刷新扩展时没有问题chrome://extensions/“窗户。问题是,如果我再次运行程序(从弹出窗口),content_script.js中的警报会触发两次。如果我再次运行我的程序,警报将触发3次。。。等等

在我看来,尽管当我从弹出窗口启动程序时background.js被刷新,但侦听器仍然在内存中,并且侦听器是重复的

如果我打电话

chrome.tabs.onUpdated.removeListener(arguments.callee)
,所有侦听器都被删除,程序不再工作,即使我从弹出窗口再次运行程序

当我从弹出窗口启动程序时,我只想得到一个干净的浏览器窗口


我认为我必须从内容脚本启动侦听器,这不会解决问题,但我不知道如何从侦听器中生成单例。

每次显示弹出窗口时,都会运行begin方法,这反过来又会添加另一个侦听器,因此,侦听器数量增加是正常的。 您需要做的是将添加侦听器的代码移到
begin()
方法之外。在加载后台页面时,应该添加一次侦听器。 然后还应该将
mySendedTabs
放在
begin()
方法之外(这样侦听器就可以随时访问它)

我不确定我是否理解您所说的“我只想在从弹出窗口启动程序时获得一个干净的浏览器窗口”是什么意思,但是(如果我的猜测正确的话)在
begin()
方法中需要做的就是重新初始化
mySendedTabs
变量

您的background.js可能如下所示:

var mySendedTabs = new Array();
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {             
    if (mySendedTabs.indexOf(tabId) == -1) {
        if(changeInfo.status == "complete") {
            chrome.tabs.sendMessage(tabId, { question: "What's your location ?" });
            mySendedTabs.push(tabId);
        }
    }
});

function begin() {
    mySendedTabs = new Array();
}
(我假设变量
mySendedTabs
在创建选项卡时(通过回调)用tabid填充。)

更新
顺便说一句,把你的背景页面变成事件页面是个好主意。(在yur的情况下,它只需要在您的清单中添加
persistent:false


查看了解更多信息和说明。

虽然当我从弹出窗口启动程序时,background.js会刷新”
”--我不明白你的意思。为什么你说你的背景页面“刷新”?后台页面的状态是持久的(除非重新启动Chrome或更新扩展);这就是后台页面的全部要点。我认为后台页面是刷新的,因为它不记得从一次运行到另一次运行的变量值,侦听器是。我在manifest.json中放入了
“persistent”:false,但它似乎没有改变任何东西。