Google chrome extension 侦听器多次实例化
我正在开发一个Chrome扩展,其中有一个弹出窗口,可以调用background.js的“begin”函数。Background.js打开选项卡,我在Background.js中有一个侦听器,它向选项卡的content_script.js发送消息: background.jsGoogle 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
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,但它似乎没有改变任何东西。