2013-07-25 78 views
3

我正在开发一个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中的警报被激发2次。如果我再次运行我的程序,警报会被触发3次......依此类推。

它在我看来,监听器仍然在内存中,尽管当我从弹出窗口启动程序并且监听器被复制时,background.js被刷新。

如果我打电话

chrome.tabs.onUpdated.removeListener(arguments.callee) 

,所有监听器被删除,该程序不工作了,即使我从弹出再次运行该程序。

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

我想我必须从内容脚本启动听众,这不会解决问题,但我不知道如何从我的听众做单身。

+0

“'虽然当我从弹出窗口启动程序时刷新了background.js” - 我不明白你的意思。你为什么说你的背景页面是“刷新”?您的后台页面的状态是持久性的(除非您重新启动Chrome或更新您的扩展程序);这是背景页面的全部要点。 – apsillers

+0

我认为后台页面会刷新,因为它不记得我的变量值从一次运行到另一次运行,听众都是。我在我的manifest.json中加入了''persistent':false',但它似乎没有改变任何东西。 –

回答

0

每次显示弹出窗口时,都会运行您的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填充了在创建标签(的tabIDs通过回调的方式)。)

更新
顺便说一句,这是一个好主意,把你的背景页面变成一个活动页面。 (在您的情况下,只能在您的清单中添加persistent: false。)
请查看docuemntation了解更多信息和说明。