我正在开发一个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)
,所有监听器被删除,该程序不工作了,即使我从弹出再次运行该程序。
我只是想从弹出窗口启动程序时得到一个干净的浏览器窗口。
我想我必须从内容脚本启动听众,这不会解决问题,但我不知道如何从我的听众做单身。
“'虽然当我从弹出窗口启动程序时刷新了background.js” - 我不明白你的意思。你为什么说你的背景页面是“刷新”?您的后台页面的状态是持久性的(除非您重新启动Chrome或更新您的扩展程序);这是背景页面的全部要点。 – apsillers
我认为后台页面会刷新,因为它不记得我的变量值从一次运行到另一次运行,听众都是。我在我的manifest.json中加入了''persistent':false',但它似乎没有改变任何东西。 –