我正在開發一個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',但它似乎沒有改變任何東西。 –